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 *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);
|
||||
|
Loading…
Reference in New Issue
Block a user