Return to check_iolog_path.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / sudoers / regress / iolog_path |
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: }