From 202ee6d1a3fbbd74cbc0aae0b44ad841214fa9dc 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 (cherry picked from commit 5b81d403386324f40af6cc23ad3d26682e52a9fa) (cherry picked from commit bb4b6be912570dd5fcfd544519b5e6d880f77e1e) (cherry picked from commit 44cbd3b036411c8b49bc2d34d4602fdc47d4921a) --- 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 270792ef9d..58a80923e4 100644 --- a/src/nm-bus-manager.c +++ b/src/nm-bus-manager.c @@ -164,7 +164,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; } @@ -243,6 +246,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 @@ -361,7 +365,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; @@ -599,7 +606,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; }