Jakub Filak de53221
From 1a9cd8817eb80b2e47a989a1fc5d14292800542e Mon Sep 17 00:00:00 2001
Jakub Filak de53221
From: Jakub Filak <jfilak@redhat.com>
Jakub Filak de53221
Date: Thu, 9 Aug 2012 13:58:49 +0200
Jakub Filak de53221
Subject: [PATCH 3/6] fix abrt-dbus crash if no element is found in GetInfo()
Jakub Filak de53221
Jakub Filak de53221
* g_variant_new() calls g_variant_builder_end() internally
Jakub Filak de53221
Jakub Filak de53221
"...
Jakub Filak de53221
It is also an error to call this function if the builder was created
Jakub Filak de53221
with an indefinite array or maybe type and no children have been added
Jakub Filak de53221
..."
Jakub Filak de53221
[g_variant_builder_end() glib-2.32 documentation]
Jakub Filak de53221
Jakub Filak de53221
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Jakub Filak de53221
---
Jakub Filak de53221
 src/dbus/abrt-dbus.c | 11 +++++++++--
Jakub Filak de53221
 1 file changed, 9 insertions(+), 2 deletions(-)
Jakub Filak de53221
Jakub Filak de53221
diff --git a/src/dbus/abrt-dbus.c b/src/dbus/abrt-dbus.c
Jakub Filak de53221
index e4a3689..4302b4f 100644
Jakub Filak de53221
--- a/src/dbus/abrt-dbus.c
Jakub Filak de53221
+++ b/src/dbus/abrt-dbus.c
Jakub Filak de53221
@@ -579,7 +579,7 @@ static void handle_method_call(GDBusConnection *connection,
Jakub Filak de53221
         GList *elements = string_list_from_variant(array);
Jakub Filak de53221
         g_variant_unref(array);
Jakub Filak de53221
 
Jakub Filak de53221
-        GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
Jakub Filak de53221
+        GVariantBuilder *builder = NULL;
Jakub Filak de53221
         for (GList *l = elements; l; l = l->next)
Jakub Filak de53221
         {
Jakub Filak de53221
             const char *element_name = (const char*)l->data;
Jakub Filak de53221
@@ -590,6 +590,9 @@ static void handle_method_call(GDBusConnection *connection,
Jakub Filak de53221
             VERB1 log("element '%s' %s", element_name, value ? "fetched" : "not found");
Jakub Filak de53221
             if (value)
Jakub Filak de53221
             {
Jakub Filak de53221
+                if (!builder)
Jakub Filak de53221
+                    builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
Jakub Filak de53221
+
Jakub Filak de53221
                 /* g_variant_builder_add makes a copy. No need to xstrdup here */
Jakub Filak de53221
                 g_variant_builder_add(builder, "{ss}", element_name, value);
Jakub Filak de53221
                 free(value);
Jakub Filak de53221
@@ -597,8 +600,12 @@ static void handle_method_call(GDBusConnection *connection,
Jakub Filak de53221
         }
Jakub Filak de53221
         list_free_with_free(elements);
Jakub Filak de53221
         dd_close(dd);
Jakub Filak de53221
+        /* It is OK to call g_variant_new("(a{ss})", NULL) because */
Jakub Filak de53221
+        /* G_VARIANT_TYPE_TUPLE allows NULL value */
Jakub Filak de53221
         GVariant *response = g_variant_new("(a{ss})", builder);
Jakub Filak de53221
-        g_variant_builder_unref(builder);
Jakub Filak de53221
+
Jakub Filak de53221
+        if (builder)
Jakub Filak de53221
+            g_variant_builder_unref(builder);
Jakub Filak de53221
 
Jakub Filak de53221
         VERB2 log("GetInfo: returning value for '%s'", problem_dir);
Jakub Filak de53221
         g_dbus_method_invocation_return_value(invocation, response);
Jakub Filak de53221
-- 
Jakub Filak de53221
1.7.11.2
Jakub Filak de53221