GDBusMethodInvocation: leak and potential crash

_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
This commit is contained in:
Patrick Ohly 2013-03-07 18:44:44 +01:00 committed by Matthias Clasen
parent 1a9567139d
commit a8811fb864

View File

@ -85,7 +85,7 @@ struct _GDBusMethodInvocation
gchar *object_path; gchar *object_path;
gchar *interface_name; gchar *interface_name;
gchar *method_name; gchar *method_name;
const GDBusMethodInfo *method_info; GDBusMethodInfo *method_info;
GDBusConnection *connection; GDBusConnection *connection;
GDBusMessage *message; GDBusMessage *message;
GVariant *parameters; GVariant *parameters;
@ -103,6 +103,8 @@ g_dbus_method_invocation_finalize (GObject *object)
g_free (invocation->object_path); g_free (invocation->object_path);
g_free (invocation->interface_name); g_free (invocation->interface_name);
g_free (invocation->method_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->connection);
g_object_unref (invocation->message); g_object_unref (invocation->message);
g_variant_unref (invocation->parameters); 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->object_path = g_strdup (object_path);
invocation->interface_name = g_strdup (interface_name); invocation->interface_name = g_strdup (interface_name);
invocation->method_name = g_strdup (method_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->connection = g_object_ref (connection);
invocation->message = g_object_ref (message); invocation->message = g_object_ref (message);
invocation->parameters = g_variant_ref (parameters); invocation->parameters = g_variant_ref (parameters);