From 5b81d403386324f40af6cc23ad3d26682e52a9fa Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 11 Oct 2017 14:50:19 +0200 Subject: [PATCH] bus-manager: don't leak connections The bus manager takes extra references to the GDBusConnection every time g_dbus_object_manager_server_get_connection() its called, preventing its disposal once the connection is closed. This causes a leak for each DHCP event. https://bugzilla.redhat.com/show_bug.cgi?id=1461643 --- src/nm-bus-manager.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/nm-bus-manager.c b/src/nm-bus-manager.c index ca07e3d9f3..f6b86e903f 100644 --- a/src/nm-bus-manager.c +++ b/src/nm-bus-manager.c @@ -171,7 +171,10 @@ close_connection_in_idle (gpointer user_data) g_hash_table_iter_init (&iter, server->obj_managers); while (g_hash_table_iter_next (&iter, (gpointer) &manager, NULL)) { - if (g_dbus_object_manager_server_get_connection (manager) == info->connection) { + gs_unref_object GDBusConnection *connection = NULL; + + connection = g_dbus_object_manager_server_get_connection (manager); + if (connection == info->connection) { g_hash_table_iter_remove (&iter); break; } @@ -250,6 +253,7 @@ private_server_manager_destroy (GDBusObjectManagerServer *manager) g_dbus_connection_close (connection, NULL, NULL, NULL); g_dbus_object_manager_server_set_connection (manager, NULL); g_object_unref (manager); + g_object_unref (connection); } static gboolean @@ -368,7 +372,10 @@ private_server_get_connection_owner (PrivateServer *s, GDBusConnection *connecti g_hash_table_iter_init (&iter, s->obj_managers); while (g_hash_table_iter_next (&iter, (gpointer) &manager, (gpointer) &owner)) { - if (g_dbus_object_manager_server_get_connection (manager) == connection) + gs_unref_object GDBusConnection *c = NULL; + + c = g_dbus_object_manager_server_get_connection (manager); + if (c == connection) return owner; } return NULL; @@ -606,7 +613,10 @@ nm_bus_manager_get_unix_user (NMBusManager *self, /* Check if it's a private connection sender, which we fake */ for (iter = priv->private_servers; iter; iter = iter->next) { - if (private_server_get_connection_by_owner (iter->data, sender)) { + gs_unref_object GDBusConnection *connection = NULL; + + connection = private_server_get_connection_by_owner (iter->data, sender); + if (connection) { *out_uid = 0; return TRUE; }