mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 17:56:17 +01:00
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:
parent
1a9567139d
commit
a8811fb864
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user