|
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 |
|