From: Todd C. Miller Date: Tue, 7 Oct 2014 18:26:32 +0000 (-0600) Subject: Make a copy of ap in sudo_debug_vprintf2() in case the static buffer X-Git-Tag: SUDO_1_8_12^2~159 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1dd96778e5508ee48848a94cd123218fe5679a45;p=sudo Make a copy of ap in sudo_debug_vprintf2() in case the static buffer is not big enough and we need to call vasprintf(). --- diff --git a/lib/util/sudo_debug.c b/lib/util/sudo_debug.c index a17443fcb..08772d05f 100644 --- a/lib/util/sudo_debug.c +++ b/lib/util/sudo_debug.c @@ -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