← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/dbusmenu/builder-crash into lp:dbusmenu

 

Ted Gould has proposed merging lp:~ted/dbusmenu/builder-crash into lp:dbusmenu.

Requested reviews:
  DBus Menu Team (dbusmenu-team)
Related bugs:
  #703039 libdbusmenu-glib crashes nm-applet due to new GVariantBuilder code
  https://bugs.launchpad.net/bugs/703039

For more details, see:
https://code.launchpad.net/~ted/dbusmenu/builder-crash/+merge/46638

Fix on builder where there are no items.  Warn when there is issues.
-- 
https://code.launchpad.net/~ted/dbusmenu/builder-crash/+merge/46638
Your team ayatana-commits is subscribed to branch lp:dbusmenu.
=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2011-01-14 15:56:07 +0000
+++ libdbusmenu-glib/server.c	2011-01-18 17:36:07 +0000
@@ -894,20 +894,31 @@
 	g_variant_iter_init(&ids, g_variant_get_child_value(params, 0));
 
 	GVariantBuilder builder;
-	g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
+	gboolean builder_init = FALSE;
 
 	gint id;
 	while (g_variant_iter_next(&ids, "i", &id)) {
 		DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
 		if (mi == NULL) continue;
 
+		if (!builder_init) {
+			g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
+			builder_init = TRUE;
+		}
+
 		GVariantBuilder wbuilder;
 		g_variant_builder_init(&wbuilder, G_VARIANT_TYPE_TUPLE);
 		g_variant_builder_add(&wbuilder, "i", id);
 		GVariant * props = dbusmenu_menuitem_properties_variant(mi);
 
 		if (props == NULL) {
-			props = g_variant_parse(g_variant_type_new("a{sv}"), "{}", NULL, NULL, NULL);
+			GError * error = NULL;
+			props = g_variant_parse(g_variant_type_new("a{sv}"), "{}", NULL, NULL, &error);
+			if (error != NULL) {
+				g_warning("Unable to parse '{}' as a 'a{sv}': %s", error->message);
+				g_error_free(error);
+				props = NULL;
+			}
 		}
 
 		g_variant_builder_add_value(&wbuilder, props);
@@ -916,11 +927,28 @@
 		g_variant_builder_add_value(&builder, mi_data);
 	}
 
-	GVariant * ret = g_variant_builder_end(&builder);
+	GVariant * ret = NULL;
+	
+	if (builder_init) {
+		ret = g_variant_builder_end(&builder);
+	} else {
+		GError * error = NULL;
+		ret = g_variant_parse(g_variant_type_new("a(ia(sv))"), "[]", NULL, NULL, NULL);
+		if (error != NULL) {
+			g_warning("Unable to parse '[]' as a 'a(ia(sv))': %s", error->message);
+			g_error_free(error);
+			ret = NULL;
+		}
+	}
 
-	g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
-	g_variant_builder_add_value(&builder, ret);
-	GVariant * final = g_variant_builder_end(&builder);
+	GVariant * final = NULL;
+	if (ret != NULL) {
+		g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
+		g_variant_builder_add_value(&builder, ret);
+		final = g_variant_builder_end(&builder);
+	} else {
+		g_warning("Error building property list, final variant is NULL");
+	}
 
 	g_dbus_method_invocation_return_value(invocation, final);
 
@@ -981,7 +1009,13 @@
 
 		ret = g_variant_new("(a(ia{svg}))", g_variant_builder_end(&builder));
 	} else {
-		ret = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL);
+		GError * error = NULL;
+		ret = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, &error);
+		if (error != NULL) {
+			g_warning("Unable to parse '([(0, {})],)' as a '(a(ia{sv}))': %s", error->message);
+			g_error_free(error);
+			ret = NULL;
+		}
 	}
 
 	g_dbus_method_invocation_return_value(invocation, ret);


Follow ups