gdbus: Fix leak of method invocation when registering an object with closures

The invocation passed in is owned by the callback.
This commit is contained in:
Sebastian Dröge 2024-12-02 16:46:17 +00:00 committed by Philip Withnall
parent 339e06125e
commit 77b50ce7d2
2 changed files with 19 additions and 2 deletions

View File

@ -5950,7 +5950,7 @@ register_with_closures_on_method_call (GDBusConnection *connection,
g_value_set_variant (&params[5], parameters);
g_value_init (&params[6], G_TYPE_DBUS_METHOD_INVOCATION);
g_value_set_object (&params[6], invocation);
g_value_take_object (&params[6], g_steal_pointer (&invocation));
g_closure_invoke (data->method_call_closure, NULL, G_N_ELEMENTS (params), params, NULL);

View File

@ -161,6 +161,23 @@ foo_method_call (GDBusConnection *connection,
}
}
static void
foo_method_call_with_closure (GDBusConnection *connection,
const gchar *sender,
const gchar *object_path,
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
/* The call below takes ownership of the invocation but ownership is not
* passed into the callback so get an additional reference here */
g_object_ref (invocation);
foo_method_call (connection, sender, object_path, interface_name, method_name, parameters, invocation, user_data);
}
static GVariant *
foo_get_property (GDBusConnection *connection,
const gchar *sender,
@ -1440,7 +1457,7 @@ test_object_registration_with_closures (void)
registration_id = g_dbus_connection_register_object_with_closures (c,
"/foo/boss",
(GDBusInterfaceInfo *) &foo_interface_info,
g_cclosure_new (G_CALLBACK (foo_method_call), NULL, NULL),
g_cclosure_new (G_CALLBACK (foo_method_call_with_closure), NULL, NULL),
g_cclosure_new (G_CALLBACK (foo_get_property), NULL, NULL),
g_cclosure_new (G_CALLBACK (foo_set_property), NULL, NULL),
&error);