_dbus_system_logv: copy the va_list here too
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Tue, 11 Jun 2013 18:20:55 +0000 (19:20 +0100)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Wed, 12 Jun 2013 16:23:28 +0000 (17:23 +0100)
This would crash if HAVE_SYSLOG_H is defined, HAVE_DECL_LOG_PERROR
is false, and the platform calling convention is that va_list is a
struct. Verified on Linux by undefining HAVE_DECL_LOG_PERROR.

Reviewed-by: Colin Walters <walters@verbum.org>
dbus/dbus-sysdeps-util-unix.c

index 789729c..6265e2b 100644 (file)
@@ -477,6 +477,7 @@ _dbus_system_log (DBusSystemLogSeverity severity, const char *msg, ...)
 void
 _dbus_system_logv (DBusSystemLogSeverity severity, const char *msg, va_list args)
 {
+  va_list tmp;
 #ifdef HAVE_SYSLOG_H
   int flags;
   switch (severity)
@@ -494,14 +495,14 @@ _dbus_system_logv (DBusSystemLogSeverity severity, const char *msg, va_list args
         return;
     }
 
-  vsyslog (flags, msg, args);
+  DBUS_VA_COPY (tmp, args);
+  vsyslog (flags, msg, tmp);
+  va_end (tmp);
 #endif
 
 #if !defined(HAVE_SYSLOG_H) || !HAVE_DECL_LOG_PERROR
     {
       /* vsyslog() won't write to stderr, so we'd better do it */
-      va_list tmp;
-
       DBUS_VA_COPY (tmp, args);
       fprintf (stderr, "dbus[" DBUS_PID_FORMAT "]: ", _dbus_getpid ());
       vfprintf (stderr, msg, tmp);