>From 984654716ae602c053c00600509bb40bf20bea1d Mon Sep 17 00:00:00 2001
From: Patrick Ohly <patrick.ohly@intel.com>
Date: Wed, 9 Dec 2009 12:19:44 +0100
Subject: [PATCH 12/12] gdbus: fixed g_dbus_create_error_valist() error handling

Out-of-memory errors were not handled correctly:
- The code using realloc() might have leaked a string.
- A static pointer was used to avoid further memory
  allocation errors, but the caller then would have
  freed it => try strdup() and check result in caller
  instead.
---
 src/object.c |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/object.c b/src/object.c
index f35ac31..8004a78 100644
--- a/src/object.c
+++ b/src/object.c
@@ -1041,12 +1041,13 @@ char *printf_dyn(const char *format, va_list ap)
         va_copy(aq, ap);
 
         if (size < realsize) {
+            char *oldbuffer = buffer;
             buffer = (char *)realloc(buffer, realsize + 1);
             if (!buffer) {
-                if (buffer) {
-                    free(buffer);
+                if (oldbuffer) {
+                    free(oldbuffer);
                 }
-                return "";
+                return strdup("");
             }
             size = realsize;
         }
@@ -1076,14 +1077,16 @@ char *printf_dyn(const char *format, va_list ap)
 DBusMessage *g_dbus_create_error_valist(DBusMessage *message, const char *name,
 						const char *format, va_list args)
 {
-	DBusMessage *msg;
+	DBusMessage *msg = NULL;
         char *descr;
 
 	DBG("message %p name %s", message, name);
 
 	descr = printf_dyn(format, args);
-	msg = dbus_message_new_error(message, name, descr);
-	free(descr);
+        if (descr) {
+            msg = dbus_message_new_error(message, name, descr);
+            free(descr);
+        }
 	return msg;
 }
 
-- 
1.6.5

