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