From: Todd C. Miller Date: Thu, 8 Nov 2012 20:37:42 +0000 (-0500) Subject: Add variants of warn/error and sudo_debug_printf that take a va_list X-Git-Tag: SUDO_1_8_7~1^2~356 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8660f9988f58980c347d9e69996e2048a4f6f65;p=sudo Add variants of warn/error and sudo_debug_printf that take a va_list instead of a variable number of args. --- diff --git a/common/sudo_debug.c b/common/sudo_debug.c index b4ce80540..0c26cbd25 100644 --- a/common/sudo_debug.c +++ b/common/sudo_debug.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Todd C. Miller + * Copyright (c) 2011-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 @@ -422,11 +422,10 @@ sudo_debug_write(const char *str, int len, int errno_val) } void -sudo_debug_printf2(const char *func, const char *file, int lineno, int level, - const char *fmt, ...) +sudo_debug_vprintf2(const char *func, const char *file, int lineno, int level, + const char *fmt, va_list ap) { int buflen, pri, subsys, saved_errno = errno; - va_list ap; char *buf; if (!sudo_debug_mode) @@ -438,7 +437,6 @@ sudo_debug_printf2(const char *func, const char *file, int lineno, int level, /* Make sure we want debug info at this level. */ if (subsys < NUM_SUBSYSTEMS && sudo_debug_settings[subsys] >= pri) { - va_start(ap, fmt); buflen = vasprintf(&buf, fmt, ap); va_end(ap); if (buflen != -1) { @@ -454,6 +452,17 @@ sudo_debug_printf2(const char *func, const char *file, int lineno, int level, errno = saved_errno; } +void +sudo_debug_printf2(const char *func, const char *file, int lineno, int level, + const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_debug_vprintf2(func, file, lineno, level, fmt, ap); + va_end(ap); +} + void sudo_debug_execve2(int level, const char *path, char *const argv[], char *const envp[]) { diff --git a/include/error.h b/include/error.h index 6b5836ba5..20c2b6dc1 100644 --- a/include/error.h +++ b/include/error.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010 Todd C. Miller + * Copyright (c) 2004, 2010-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 @@ -35,6 +35,10 @@ # define warning(...) warning2(__VA_ARGS__) # define warningx(...) warningx2(__VA_ARGS__) # endif /* __GNUC__ == 2 */ +# define verror(rval, fmt, ap) error2((rval), (fmt), (ap)) +# define verrorx(rval, fmt, ap) errorx2((rval), (fmt), (ap)) +# define vwarning(fmt, ap) warning2((fmt), (ap)) +# define vwarningx(fmt, ap) warningx2((fmt), (ap)) #else /* SUDO_ERROR_WRAP */ # if defined(__GNUC__) && __GNUC__ == 2 # define error(rval, fmt...) do { \ @@ -83,11 +87,37 @@ warningx2(__VA_ARGS__); \ } while (0) # endif /* __GNUC__ == 2 */ +# define verror(rval, fmt, ap) do { \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + (fmt), (ap)); \ + verror2((rval), (fmt), (ap)); \ +} while (0) +# define verrorx(rval, fmt, ap) do { \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), (ap)); \ + verrorx2((rval), (fmt), (ap)); \ +} while (0) +# define vwarning(fmt, ap) do { \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + (fmt), (ap)); \ + vwarning2((fmt), (ap)); \ +} while (0) +# define vwarningx(fmt, ap) do { \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), (ap)); \ + vwarningx2((fmt), (ap)); \ +} while (0) #endif /* SUDO_ERROR_WRAP */ -void error2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__)); -void errorx2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__)); +void error2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__)); +void errorx2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__)); +void verror2(int, const char *, va_list ap) __attribute__((__noreturn__)); +void verrorx2(int, const char *, va_list ap) __attribute__((__noreturn__)); void warning2(const char *, ...) __printflike(1, 2); void warningx2(const char *, ...) __printflike(1, 2); +void vwarning2(const char *, va_list ap); +void vwarningx2(const char *, va_list ap); #endif /* _SUDO_ERROR_H_ */ diff --git a/include/sudo_debug.h b/include/sudo_debug.h index 5f6871e13..ed1cd7147 100644 --- a/include/sudo_debug.h +++ b/include/sudo_debug.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Todd C. Miller + * Copyright (c) 2011-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 @@ -201,7 +201,8 @@ void sudo_debug_exit_str_masked(const char *func, const char *file, int line, in void sudo_debug_exit_ptr(const char *func, const char *file, int line, int subsys, const void *rval); int sudo_debug_fd_set(int fd); int sudo_debug_init(const char *debugfile, const char *settings); -void sudo_debug_printf2(const char *func, const char *file, int line, int level, const char *format, ...) __printflike(5, 6); +void sudo_debug_printf2(const char *func, const char *file, int line, int level, const char *fmt, ...) __printflike(5, 6); +void sudo_debug_vprintf2(const char *func, const char *file, int line, int level, const char *fmt, va_list ap); void sudo_debug_write(const char *str, int len, int errno_val); void sudo_debug_write2(const char *func, const char *file, int line, const char *str, int len, int errno_val); pid_t sudo_debug_fork(void); diff --git a/plugins/sudoers/plugin_error.c b/plugins/sudoers/plugin_error.c index 51b121808..02cf97854 100644 --- a/plugins/sudoers/plugin_error.c +++ b/plugins/sudoers/plugin_error.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2005, 2010 Todd C. Miller + * Copyright (c) 2004-2005, 2010-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 @@ -63,6 +63,22 @@ errorx2(int eval, const char *fmt, ...) siglongjmp(error_jmp, eval); } +void +verror2(int eval, const char *fmt, va_list ap) +{ + _warning(1, fmt, ap); + sudoers_plugin_cleanup(0); + siglongjmp(error_jmp, eval); +} + +void +verrorx2(int eval, const char *fmt, va_list ap) +{ + _warning(0, fmt, ap); + sudoers_plugin_cleanup(0); + siglongjmp(error_jmp, eval); +} + void warning2(const char *fmt, ...) { @@ -82,6 +98,18 @@ warningx2(const char *fmt, ...) va_end(ap); } +void +vwarning2(const char *fmt, va_list ap) +{ + _warning(1, fmt, ap); +} + +void +vwarningx2(const char *fmt, va_list ap) +{ + _warning(0, fmt, ap); +} + static void _warning(int use_errno, const char *fmt, va_list ap) { diff --git a/src/error.c b/src/error.c index 56108c1f6..7736da77d 100644 --- a/src/error.c +++ b/src/error.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2005, 2010 Todd C. Miller + * Copyright (c) 2004-2005, 2010-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 @@ -35,56 +35,84 @@ static void _warning(int, const char *, va_list); void error2(int eval, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - _warning(1, fmt, ap); - va_end(ap); - cleanup(0); - exit(eval); + va_list ap; + va_start(ap, fmt); + _warning(1, fmt, ap); + va_end(ap); + cleanup(0); + exit(eval); } void errorx2(int eval, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - _warning(0, fmt, ap); - va_end(ap); - cleanup(0); - exit(eval); + va_list ap; + va_start(ap, fmt); + _warning(0, fmt, ap); + va_end(ap); + cleanup(0); + exit(eval); +} + +void +verror2(int eval, const char *fmt, va_list ap) +{ + _warning(1, fmt, ap); + cleanup(0); + exit(eval); +} + +void +verrorx2(int eval, const char *fmt, va_list ap) +{ + _warning(0, fmt, ap); + cleanup(0); + exit(eval); } void warning2(const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - _warning(1, fmt, ap); - va_end(ap); + va_list ap; + va_start(ap, fmt); + _warning(1, fmt, ap); + va_end(ap); } void warningx2(const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - _warning(0, fmt, ap); - va_end(ap); + va_list ap; + va_start(ap, fmt); + _warning(0, fmt, ap); + va_end(ap); +} + +void +vwarning2(const char *fmt, va_list ap) +{ + _warning(1, fmt, ap); +} + +void +vwarningx2(const char *fmt, va_list ap) +{ + _warning(0, fmt, ap); } static void _warning(int use_errno, const char *fmt, va_list ap) { - int serrno = errno; - - fputs(getprogname(), stderr); - if (fmt != NULL) { - fputs(_(": "), stderr); - vfprintf(stderr, fmt, ap); - } - if (use_errno) { - fputs(_(": "), stderr); - fputs(strerror(serrno), stderr); - } - putc('\n', stderr); + int serrno = errno; + + fputs(getprogname(), stderr); + if (fmt != NULL) { + fputs(_(": "), stderr); + vfprintf(stderr, fmt, ap); + } + if (use_errno) { + fputs(_(": "), stderr); + fputs(strerror(serrno), stderr); + } + putc('\n', stderr); }