Add variants of warn/error and sudo_debug_printf that take a va_list
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 8 Nov 2012 20:37:42 +0000 (15:37 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 8 Nov 2012 20:37:42 +0000 (15:37 -0500)
instead of a variable number of args.

common/sudo_debug.c
include/error.h
include/sudo_debug.h
plugins/sudoers/plugin_error.c
src/error.c

index b4ce805401d55403d7b4667fe552f642bc0bcb73..0c26cbd25e3020c5193d1f7dac089609c0e48af6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2012 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * 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[])
 {
index 6b5836ba57fe429858585d8ba47530420943c7a5..20c2b6dc19d48d4436e762e17d46c06be624665e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004, 2010-2012 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
 #  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 {                                            \
     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_ */
index 5f6871e137beb6fe22458c803b205f0808f144c9..ed1cd7147ef583e5a2ba81f02b24fbed07d51f62 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2012 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * 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);
index 51b121808b6445efb996a0b778171099be3eae4a..02cf9785411ee320d08e689853d08f2a079dcf8e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2005, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004-2005, 2010-2012 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * 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)
 {
index 56108c1f6e68f21b3f66317de559a3e36b54be3c..7736da77d2d5145111d5d3e966688adc84eb3490 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2005, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004-2005, 2010-2012 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * 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);
 }