]> granicus.if.org Git - sudo/commitdiff
Make a copy of ap in sudo_debug_vprintf2() in case the static buffer
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 7 Oct 2014 18:26:32 +0000 (12:26 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 7 Oct 2014 18:26:32 +0000 (12:26 -0600)
is not big enough and we need to call vasprintf().

lib/util/sudo_debug.c

index a17443fcb5893e0923ed78db33105f2538caa317..08772d05f66e4e2ad804a9930b252c9de30c4ef3 100644 (file)
@@ -370,8 +370,7 @@ void
 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;
-    char static_buf[1024], *buf = static_buf;
+    int pri, subsys;
 
     if (!sudo_debug_initialized)
        return;
@@ -382,10 +381,15 @@ sudo_debug_vprintf2(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) {
+       char static_buf[1024], *buf = static_buf;
+       int buflen, saved_errno = errno;
+       va_list ap2;
+
+       va_copy(ap2, ap);
        buflen = fmt ? vsnprintf(static_buf, sizeof(static_buf), fmt, ap) : 0;
        if (buflen >= (int)sizeof(static_buf)) {
            /* Not enough room in static buf, allocate dynamically. */
-           buflen = vasprintf(&buf, fmt, ap);
+           buflen = vasprintf(&buf, fmt, ap2);
        }
        if (buflen != -1) {
            int errcode = ISSET(level, SUDO_DEBUG_ERRNO) ? saved_errno : 0;
@@ -396,9 +400,9 @@ sudo_debug_vprintf2(const char *func, const char *file, int lineno, int level,
            if (buf != static_buf)
                free(buf);
        }
+       va_end(ap2);
+       errno = saved_errno;
     }
-
-    errno = saved_errno;
 }
 
 #ifdef NO_VARIADIC_MACROS