From: Todd C. Miller Date: Fri, 6 Jan 2012 18:13:04 +0000 (-0500) Subject: Enable debugging via sudo.conf. X-Git-Tag: SUDO_1_8_4~84^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae43a19ad66e7e8b1163f469f25b1ba180ed1a87;p=sudo Enable debugging via sudo.conf. --- diff --git a/plugins/sudoers/sudoreplay.c b/plugins/sudoers/sudoreplay.c index da7dfdb68..df83a50e0 100644 --- a/plugins/sudoers/sudoreplay.c +++ b/plugins/sudoers/sudoreplay.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2011 Todd C. Miller + * Copyright (c) 2009-2012 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -85,16 +85,21 @@ # include #endif #include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ #include -#define SUDO_ERROR_WRAP 0 /* XXX */ - #include "missing.h" #include "alloc.h" #include "error.h" #include "gettext.h" #include "sudo_plugin.h" +#include "sudo_conf.h" +#include "sudo_debug.h" #ifndef LINE_MAX # define LINE_MAX 2048 @@ -230,7 +235,7 @@ static int parse_timing(const char *buf, const char *decimal, int *idx, double * int main(int argc, char *argv[]) { - int ch, idx, plen, nready, interactive = 0, listonly = 0; + int ch, idx, plen, nready, exitcode = 0, interactive = 0, listonly = 0; const char *id, *user = NULL, *pattern = NULL, *tty = NULL, *decimal = "."; char path[PATH_MAX], buf[LINE_MAX], *cp, *ep; double seconds, to_wait, speed = 1.0, max_wait = 0; @@ -239,6 +244,14 @@ main(int argc, char *argv[]) sigaction_t sa; size_t len, nbytes, nread, off; ssize_t nwritten; + debug_decl(main, SUDO_DEBUG_MAIN) + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "AFGJPR"; + } +#endif #if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME) setprogname(argc > 0 ? argv[0] : "sudoreplay"); @@ -251,6 +264,9 @@ main(int argc, char *argv[]) bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have sudoreplay domain */ textdomain("sudoers"); + /* Read sudo.conf. */ + sudo_conf_read(); + while ((ch = getopt(argc, argv, "d:f:hlm:s:V")) != -1) { switch(ch) { case 'd': @@ -290,7 +306,7 @@ main(int argc, char *argv[]) break; case 'V': (void) printf(_("%s version %s\n"), getprogname(), PACKAGE_VERSION); - exit(0); + goto done; default: usage(1); /* NOTREACHED */ @@ -300,8 +316,10 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; - if (listonly) - exit(list_sessions(argc, argv, pattern, user, tty)); + if (listonly) { + exitcode = list_sessions(argc, argv, pattern, user, tty); + goto done; + } if (argc != 1) usage(1); @@ -434,7 +452,9 @@ main(int argc, char *argv[]) } } term_restore(STDIN_FILENO, 1); - exit(0); +done: + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + exit(exitcode); } static void @@ -457,7 +477,7 @@ delay(double secs) rval = nanosleep(&ts, &rts); } while (rval == -1 && errno == EINTR); if (rval == -1) { - error(1, _("nanosleep: tv_sec %ld, tv_nsec %ld"), + error2(1, _("nanosleep: tv_sec %ld, tv_nsec %ld"), (long)ts.tv_sec, (long)ts.tv_nsec); } } @@ -467,14 +487,14 @@ open_io_fd(char *path, int len, const char *suffix, union io_fd *fdp) { path[len] = '\0'; strlcat(path, suffix, PATH_MAX); + debug_decl(open_io_fd, SUDO_DEBUG_UTIL) #ifdef HAVE_ZLIB_H fdp->g = gzopen(path, "r"); - return fdp->g ? 0 : -1; #else fdp->f = fopen(path, "r"); - return fdp->f ? 0 : -1; #endif + debug_return_int(fdp->v ? 0 : -1); } /* @@ -485,6 +505,7 @@ parse_expr(struct search_node **headp, char *argv[]) { struct search_node *sn, *newsn; char or = 0, not = 0, type, **av; + debug_decl(parse_expr, SUDO_DEBUG_UTIL) sn = *headp; for (av = argv; *av; av++) { @@ -561,7 +582,7 @@ parse_expr(struct search_node **headp, char *argv[]) errorx(1, _("unmatched ')' in expression")); if (node_stack[stack_top]) sn->next = node_stack[stack_top]->next; - return av - argv + 1; + debug_return_int(av - argv + 1); bad: default: errorx(1, _("unknown search term \"%s\""), *av); @@ -607,14 +628,15 @@ parse_expr(struct search_node **headp, char *argv[]) if (not) errorx(1, _("illegal trailing \"!\"")); - return av - argv; + debug_return_int(av - argv); } -static int +static bool match_expr(struct search_node *head, struct log_info *log) { struct search_node *sn; - int matched = 1, rc; + bool matched = true, rc; + debug_decl(match_expr, SUDO_DEBUG_UTIL) for (sn = head; sn; sn = sn->next) { /* If we have no match, skip ahead to the next OR entry. */ @@ -663,7 +685,7 @@ match_expr(struct search_node *head, struct log_info *log) if (sn->negated) matched = !matched; } - return matched; + debug_return_bool(matched); } static int @@ -674,6 +696,7 @@ list_session(char *logfile, REGEX_T *re, const char *user, const char *tty) struct log_info li; size_t bufsize = 0, cwdsize = 0, cmdsize = 0; int rval = -1; + debug_decl(list_session, SUDO_DEBUG_UTIL) fp = fopen(logfile, "r"); if (fp == NULL) { @@ -754,9 +777,10 @@ list_session(char *logfile, REGEX_T *re, const char *user, const char *tty) done: fclose(fp); - return rval; + debug_return_int(rval); } +/* XXX - always returns 0, calls error() on failure */ static int find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty) { @@ -766,6 +790,7 @@ find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty) size_t sdlen; int len; char pathbuf[PATH_MAX]; + debug_decl(find_sessions, SUDO_DEBUG_UTIL) d = opendir(dir); if (d == NULL) @@ -804,14 +829,16 @@ find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty) } closedir(d); - return 0; + debug_return_int(0); } +/* XXX - always returns 0, calls error() on failure */ static int list_sessions(int argc, char **argv, const char *pattern, const char *user, const char *tty) { REGEX_T rebuf, *re = NULL; + debug_decl(list_sessions, SUDO_DEBUG_UTIL) /* Parse search expression if present */ parse_expr(&search_expr, argv); @@ -827,7 +854,7 @@ list_sessions(int argc, char **argv, const char *pattern, const char *user, re = (char *) pattern; #endif /* HAVE_REGCOMP */ - return find_sessions(session_dir, re, user, tty); + debug_return_int(find_sessions(session_dir, re, user, tty)); } /* @@ -842,6 +869,7 @@ check_input(int ttyfd, double *speed) struct timeval tv; char ch; ssize_t n; + debug_decl(check_input, SUDO_DEBUG_UTIL) fdsr = (fd_set *)emalloc2(howmany(ttyfd + 1, NFDBITS), sizeof(fd_mask)); @@ -873,6 +901,7 @@ check_input(int ttyfd, double *speed) } } free(fdsr); + debug_return; } /* @@ -894,6 +923,7 @@ parse_timing(buf, decimal, idx, seconds, nbytes) long l; double d, fract = 0; char *cp, *ep; + debug_decl(parse_timing, SUDO_DEBUG_UTIL) /* Parse index */ ul = strtoul(buf, &ep, 10); @@ -934,9 +964,9 @@ parse_timing(buf, decimal, idx, seconds, nbytes) goto bad; *nbytes = (size_t)ul; - return 1; + debug_return_int(1); bad: - return 0; + debug_return_int(0); } static void