summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-string.c
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2004-03-05 14:05:33 +0000
committerDavid Zeuthen <davidz@redhat.com>2004-03-05 14:05:33 +0000
commit868dd4b4b0be082b86354b1f89ed9cffd5b8e193 (patch)
tree73b59bb44eaab572d35ce55dc415d614f68a84fe /dbus/dbus-string.c
parent47d8e53bfeccc6f90475408bfbef9c0132a4122f (diff)
2004-03-01 David Zeuthen <david@fubar.dk>
* 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
Diffstat (limited to 'dbus/dbus-string.c')
-rw-r--r--dbus/dbus-string.c20
1 files changed, 16 insertions, 4 deletions
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;
}