GDBusMethodInvocation: leak and potential crash
authorPatrick Ohly <patrick.ohly@intel.com>
Thu, 7 Mar 2013 17:44:44 +0000 (18:44 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 18 Mar 2013 02:46:20 +0000 (22:46 -0400)
_g_dbus_method_invocation_new is said to allow method_info == NULL,
but will crash inside g_dbus_method_info_ref when the method_info
really is NULL, because g_dbus_method_info_ref does not allow NULL as
parameter. Fixed by checking for NULL in _g_dbus_method_invocation_new
itself.

The leak itself happens because _g_dbus_method_invocation_new stores a
new reference to the method_info without also unreferencing it. Fixed
by adding the missing unref, protected by an if because the pointer
may be NULL.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=695376

gio/gdbusmethodinvocation.c

index 979468e..12c04db 100644 (file)
@@ -85,7 +85,7 @@ struct _GDBusMethodInvocation
   gchar           *object_path;
   gchar           *interface_name;
   gchar           *method_name;
-  const GDBusMethodInfo *method_info;
+  GDBusMethodInfo *method_info;
   GDBusConnection *connection;
   GDBusMessage    *message;
   GVariant        *parameters;
@@ -103,6 +103,8 @@ g_dbus_method_invocation_finalize (GObject *object)
   g_free (invocation->object_path);
   g_free (invocation->interface_name);
   g_free (invocation->method_name);
+  if (invocation->method_info)
+      g_dbus_method_info_unref (invocation->method_info);
   g_object_unref (invocation->connection);
   g_object_unref (invocation->message);
   g_variant_unref (invocation->parameters);
@@ -328,7 +330,8 @@ _g_dbus_method_invocation_new (const gchar           *sender,
   invocation->object_path = g_strdup (object_path);
   invocation->interface_name = g_strdup (interface_name);
   invocation->method_name = g_strdup (method_name);
-  invocation->method_info = g_dbus_method_info_ref ((GDBusMethodInfo *)method_info);
+  if (method_info)
+    invocation->method_info = g_dbus_method_info_ref ((GDBusMethodInfo *)method_info);
   invocation->connection = g_object_ref (connection);
   invocation->message = g_object_ref (message);
   invocation->parameters = g_variant_ref (parameters);