Merge lp:~ted/libdbusmenu/builder-crash into lp:libdbusmenu/0.5

Proposed by Ted Gould
Status: Merged
Merged at revision: 188
Proposed branch: lp:~ted/libdbusmenu/builder-crash
Merge into: lp:libdbusmenu/0.5
Diff against target: 85 lines (+41/-7)
1 file modified
libdbusmenu-glib/server.c (+41/-7)
To merge this branch: bzr merge lp:~ted/libdbusmenu/builder-crash
Reviewer Review Type Date Requested Status
DBus Menu Team Pending
Review via email: mp+46638@code.launchpad.net

Description of the change

Fix on builder where there are no items. Warn when there is issues.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libdbusmenu-glib/server.c'
2--- libdbusmenu-glib/server.c 2011-01-14 15:56:07 +0000
3+++ libdbusmenu-glib/server.c 2011-01-18 17:39:31 +0000
4@@ -894,20 +894,31 @@
5 g_variant_iter_init(&ids, g_variant_get_child_value(params, 0));
6
7 GVariantBuilder builder;
8- g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
9+ gboolean builder_init = FALSE;
10
11 gint id;
12 while (g_variant_iter_next(&ids, "i", &id)) {
13 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
14 if (mi == NULL) continue;
15
16+ if (!builder_init) {
17+ g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
18+ builder_init = TRUE;
19+ }
20+
21 GVariantBuilder wbuilder;
22 g_variant_builder_init(&wbuilder, G_VARIANT_TYPE_TUPLE);
23 g_variant_builder_add(&wbuilder, "i", id);
24 GVariant * props = dbusmenu_menuitem_properties_variant(mi);
25
26 if (props == NULL) {
27- props = g_variant_parse(g_variant_type_new("a{sv}"), "{}", NULL, NULL, NULL);
28+ GError * error = NULL;
29+ props = g_variant_parse(g_variant_type_new("a{sv}"), "{}", NULL, NULL, &error);
30+ if (error != NULL) {
31+ g_warning("Unable to parse '{}' as a 'a{sv}': %s", error->message);
32+ g_error_free(error);
33+ props = NULL;
34+ }
35 }
36
37 g_variant_builder_add_value(&wbuilder, props);
38@@ -916,11 +927,28 @@
39 g_variant_builder_add_value(&builder, mi_data);
40 }
41
42- GVariant * ret = g_variant_builder_end(&builder);
43+ GVariant * ret = NULL;
44+
45+ if (builder_init) {
46+ ret = g_variant_builder_end(&builder);
47+ } else {
48+ GError * error = NULL;
49+ ret = g_variant_parse(g_variant_type_new("a(ia(sv))"), "[]", NULL, NULL, NULL);
50+ if (error != NULL) {
51+ g_warning("Unable to parse '[]' as a 'a(ia(sv))': %s", error->message);
52+ g_error_free(error);
53+ ret = NULL;
54+ }
55+ }
56
57- g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
58- g_variant_builder_add_value(&builder, ret);
59- GVariant * final = g_variant_builder_end(&builder);
60+ GVariant * final = NULL;
61+ if (ret != NULL) {
62+ g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
63+ g_variant_builder_add_value(&builder, ret);
64+ final = g_variant_builder_end(&builder);
65+ } else {
66+ g_warning("Error building property list, final variant is NULL");
67+ }
68
69 g_dbus_method_invocation_return_value(invocation, final);
70
71@@ -981,7 +1009,13 @@
72
73 ret = g_variant_new("(a(ia{svg}))", g_variant_builder_end(&builder));
74 } else {
75- ret = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL);
76+ GError * error = NULL;
77+ ret = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, &error);
78+ if (error != NULL) {
79+ g_warning("Unable to parse '([(0, {})],)' as a '(a(ia{sv}))': %s", error->message);
80+ g_error_free(error);
81+ ret = NULL;
82+ }
83 }
84
85 g_dbus_method_invocation_return_value(invocation, ret);

Subscribers

People subscribed via source and target branches