From a6ebda3d690098e28319dc391fb82a281f9113e8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 29 Mar 2009 19:08:57 +0000 Subject: [PATCH] Copy a va_list when using it multiple times. Reported by Wim Lewis. * glib/gmessages.c (g_logv): Copy a va_list when using it multiple times. Reported by Wim Lewis. svn path=/trunk/; revision=8021 --- ChangeLog | 8 ++++++++ glib/gmessages.c | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 28abae5c..cf61d68d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-03-29 Matthias Clasen + + Bug 577137 – g_logv() will crash if given format args and multiple + log levels + + * glib/gmessages.c (g_logv): Copy a va_list when using it + multiple times. Reported by Wim Lewis. + 2009-03-16 Alexander Larsson Bug 575555 – Use fsync() when replacing files to avoid data loss on crash diff --git a/glib/gmessages.c b/glib/gmessages.c index 7b90a021..e080ad6d 100644 --- a/glib/gmessages.c +++ b/glib/gmessages.c @@ -462,14 +462,23 @@ g_logv (const gchar *log_domain, * in an out-of-memory situation */ gchar buffer[1025]; - gint size; - size = _g_vsnprintf (buffer, 1024, format, args1); + gsize size; + va_list args2; + + G_VA_COPY (args2, args1); + size = _g_vsnprintf (buffer, 1024, format, args2); + va_end (args2); log_func (log_domain, test_level, buffer, data); } else { - gchar *msg = g_strdup_vprintf (format, args1); + gchar *msg; + va_list args2; + + G_VA_COPY (args2, args1); + msg = g_strdup_vprintf (format, args2); + va_end (args2); log_func (log_domain, test_level, msg, data); -- 2.34.1