From 868dd4b4b0be082b86354b1f89ed9cffd5b8e193 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Fri, 5 Mar 2004 14:05:33 +0000 Subject: 2004-03-01 David Zeuthen * dbus/dbus-string.c (_dbus_string_append_printf_valist): Fix a bug where args were used twice. This bug resulted in a segfault on a Debian/PPC system when starting the messagebus daemon. Include dbus-sysdeps.h for DBUS_VA_COPY * dbus/dbus-sysdeps.h: Define DBUS_VA_COPY if neccessary. From GLib * configure.in: Check for va_copy; define DBUS_VA_COPY to the appropriate va_copy implementation. From GLib --- dbus/dbus-string.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'dbus/dbus-string.c') diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c index f78d01c9..6a83398d 100644 --- a/dbus/dbus-string.c +++ b/dbus/dbus-string.c @@ -31,6 +31,8 @@ #define DBUS_CAN_USE_DBUS_STRING_PRIVATE 1 #include "dbus-string-private.h" #include "dbus-protocol.h" +/* for DBUS_VA_COPY */ +#include "dbus-sysdeps.h" /** * @defgroup DBusString string class @@ -1013,16 +1015,26 @@ _dbus_string_append_printf_valist (DBusString *str, { int len; char c; + va_list args_copy; + DBUS_STRING_PREAMBLE (str); - + + DBUS_VA_COPY (args_copy, args); + /* Measure the message length without terminating nul */ len = vsnprintf (&c, 1, format, args); if (!_dbus_string_lengthen (str, len)) - return FALSE; - + { + /* don't leak the copy */ + va_end (args_copy); + return FALSE; + } + vsprintf (real->str + (real->len - len), - format, args); + format, args_copy); + + va_end (args_copy); return TRUE; } -- cgit