From aeb88313c2110389ec530c8c7d5d816bac24d254 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 15 Sep 2020 00:41:00 -0400 Subject: [PATCH 2/3] session: Don't leak remote greeter interface XDMCP login screens get a "Remote Geeter Interface" exported over the bus connection (so the login window can provide a Disconnect button). This interface is getting leaked when the session object is disposed, leaving the bus connection itself undisposed, which causes an fd leak. This commit plugs the interface leak, and thus the fd leak. --- daemon/gdm-session.c | 1 + 1 file changed, 1 insertion(+) diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index 540a2534d..d6d8f128a 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -3602,60 +3602,61 @@ gdm_session_get_property (GObject *object, break; #ifdef ENABLE_WAYLAND_SUPPORT case PROP_IGNORE_WAYLAND: g_value_set_boolean (value, self->priv->ignore_wayland); break; #endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gdm_session_dispose (GObject *object) { GdmSession *self; self = GDM_SESSION (object); g_debug ("GdmSession: Disposing session"); gdm_session_close (self); g_clear_pointer (&self->priv->conversations, g_hash_table_unref); g_clear_object (&self->priv->user_verifier_interface); g_clear_pointer (&self->priv->user_verifier_extensions, g_hash_table_unref); g_clear_object (&self->priv->greeter_interface); + g_clear_object (&self->priv->remote_greeter_interface); g_clear_object (&self->priv->chooser_interface); g_free (self->priv->display_name); self->priv->display_name = NULL; g_free (self->priv->display_hostname); self->priv->display_hostname = NULL; g_free (self->priv->display_device); self->priv->display_device = NULL; g_free (self->priv->display_seat_id); self->priv->display_seat_id = NULL; g_free (self->priv->display_x11_authority_file); self->priv->display_x11_authority_file = NULL; g_strfreev (self->priv->conversation_environment); self->priv->conversation_environment = NULL; if (self->priv->worker_server != NULL) { g_dbus_server_stop (self->priv->worker_server); g_clear_object (&self->priv->worker_server); } if (self->priv->outside_server != NULL) { g_dbus_server_stop (self->priv->outside_server); g_clear_object (&self->priv->outside_server); } -- 2.26.2