← Back to team overview

ayatana-commits team mailing list archive

[Branch ~dbusmenu-team/dbusmenu/trunk] Rev 188: Fix some crashes when building variants improperly

 

Merge authors:
  Ted Gould (ted)
Related merge proposals:
  https://code.launchpad.net/~ted/dbusmenu/builder-crash/+merge/46638
  proposed by: Ted Gould (ted)
------------------------------------------------------------
revno: 188 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Thu 2011-01-20 08:19:10 -0600
message:
  Fix some crashes when building variants improperly
modified:
  libdbusmenu-glib/server.c


--
lp:dbusmenu
https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk

Your team ayatana-commits is subscribed to branch lp:dbusmenu.
To unsubscribe from this branch go to https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk/+edit-subscription
=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2011-01-18 18:39:57 +0000
+++ libdbusmenu-glib/server.c	2011-01-20 14:19:10 +0000
@@ -907,20 +907,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);
@@ -929,11 +940,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);
 
@@ -994,7 +1022,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);