Annotation of embedaddon/sudo/plugins/sudoers/regress/iolog_path/check_iolog_path.c, revision 1.1.1.4
1.1 misho 1: /*
1.1.1.4 ! misho 2: * Copyright (c) 2011-2013 Todd C. Miller <Todd.Miller@courtesan.com>
1.1 misho 3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #include <config.h>
18:
19: #include <sys/types.h>
20: #include <stdio.h>
21: #ifdef STDC_HEADERS
22: # include <stdlib.h>
23: # include <stddef.h>
24: #else
25: # ifdef HAVE_STDLIB_H
26: # include <stdlib.h>
27: # endif
28: #endif /* STDC_HEADERS */
29: #ifdef HAVE_STRING_H
30: # if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
31: # include <memory.h>
32: # endif
33: # include <string.h>
34: #endif /* HAVE_STRING_H */
35: #ifdef HAVE_STRINGS_H
36: # include <strings.h>
37: #endif /* HAVE_STRINGS_H */
38: #include <pwd.h>
39: #include <grp.h>
40: #include <time.h>
41:
1.1.1.2 misho 42: #define SUDO_ERROR_WRAP 0
43:
1.1 misho 44: #define _SUDO_MAIN
45: #include "sudoers.h"
46: #include "def_data.c"
47:
48: struct sudo_user sudo_user;
49: struct passwd *list_pw;
50:
51: static char sessid[7];
52:
1.1.1.4 ! misho 53: __dso_public int main(int argc, char *argv[]);
! 54:
1.1 misho 55: static void
56: usage(void)
57: {
58: fprintf(stderr, "usage: check_iolog_path datafile\n");
59: exit(1);
60: }
61:
62: static int
63: do_check(char *dir_in, char *file_in, char *tdir_out, char *tfile_out)
64: {
65: char *path, *slash;
66: char dir_out[4096], file_out[4096];
67: struct tm *timeptr;
68: time_t now;
69: int error = 0;
70:
71: /*
72: * Expand any strftime(3) escapes
73: * XXX - want to pass timeptr to expand_iolog_path
74: */
75: time(&now);
76: timeptr = localtime(&now);
77: strftime(dir_out, sizeof(dir_out), tdir_out, timeptr);
78: strftime(file_out, sizeof(file_out), tfile_out, timeptr);
79:
80: path = expand_iolog_path(NULL, dir_in, file_in, &slash);
81: *slash = '\0';
82: if (strcmp(path, dir_out) != 0) {
83: warningx("%s: expected %s, got %s", dir_in, dir_out, path);
84: error = 1;
85: }
86: if (strcmp(slash + 1, file_out) != 0) {
87: warningx("%s: expected %s, got %s", file_in, file_out, slash + 1);
88: error = 1;
89: }
90:
91: return error;
92: }
93:
94: #define MAX_STATE 12
95:
96: int
97: main(int argc, char *argv[])
98: {
99: struct passwd pw, rpw;
100: size_t len;
101: FILE *fp;
102: char line[2048];
103: char *file_in = NULL, *file_out = NULL;
104: char *dir_in = NULL, *dir_out = NULL;
105: int state = 0;
106: int errors = 0;
107: int tests = 0;
108:
109: #if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME)
110: setprogname(argc > 0 ? argv[0] : "check_iolog_path");
111: #endif
112:
113: if (argc != 2)
114: usage();
115:
116: fp = fopen(argv[1], "r");
117: if (fp == NULL)
1.1.1.4 ! misho 118: fatalx("unable to open %s", argv[1]);
1.1 misho 119:
120: memset(&pw, 0, sizeof(pw));
121: memset(&rpw, 0, sizeof(rpw));
122: sudo_user.pw = &pw;
123: sudo_user._runas_pw = &rpw;
124:
125: /*
126: * Input consists of 12 lines:
127: * sequence number
128: * user name
129: * user gid
130: * runas user name
131: * runas gid
132: * hostname [short form]
133: * command
134: * dir [with escapes]
135: * file [with escapes]
136: * expanded dir
137: * expanded file
138: * empty line
139: */
140: while (fgets(line, sizeof(line), fp) != NULL) {
141: len = strcspn(line, "\n");
142: line[len] = '\0';
143:
144: switch (state) {
145: case 0:
146: strlcpy(sessid, line, sizeof(sessid));
147: break;
148: case 1:
149: if (user_name != NULL)
150: free(user_name);
151: user_name = strdup(line);
152: break;
153: case 2:
154: user_gid = atoi(line);
155: break;
156: case 3:
157: if (runas_pw->pw_name != NULL)
158: free(runas_pw->pw_name);
159: runas_pw->pw_name = strdup(line);
160: break;
161: case 4:
162: runas_pw->pw_gid = atoi(line);
163: break;
164: case 5:
165: user_shost = strdup(line);
166: break;
167: case 6:
168: user_base = strdup(line);
169: break;
170: case 7:
171: dir_in = strdup(line);
172: break;
173: case 8:
174: file_in = strdup(line);
175: break;
176: case 9:
177: dir_out = strdup(line);
178: break;
179: case 10:
180: file_out = strdup(line);
181: break;
182: case 11:
183: errors += do_check(dir_in, file_in, dir_out, file_out);
184: tests++;
185: break;
186: default:
1.1.1.4 ! misho 187: fatalx("internal error, invalid state %d", state);
1.1 misho 188: }
189: state = (state + 1) % MAX_STATE;
190: }
191:
192: if (tests != 0) {
193: printf("iolog_path: %d test%s run, %d errors, %d%% success rate\n",
194: tests, tests == 1 ? "" : "s", errors,
195: (tests - errors) * 100 / tests);
196: }
197:
198: exit(errors);
199: }
200:
1.1.1.3 misho 201: void io_nextid(char *iolog_dir, char *fallback, char id[7])
1.1 misho 202: {
203: memcpy(id, sessid, sizeof(sessid));
204: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>