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;
/* 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;
if (buf != static_buf)
free(buf);
}
+ va_end(ap2);
+ errno = saved_errno;
}
-
- errno = saved_errno;
}
#ifdef NO_VARIADIC_MACROS