From e2e7cf3f3ac78ca2727fdedff7ec33a5465a1215 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 15 Sep 2020 11:28:48 -0400 Subject: [PATCH 3/3] xdmcp-display-factory: Clear launch environment when done with it The XDMCP disply factory examines the sessions of its displays' launch environments when the displays change status. Unfortunately it leaks a reference to the launch environment when doing that. This commit fixes the reference leak which leads to an fd leak. --- daemon/gdm-xdmcp-display-factory.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c index 5b5786c6f..04ba60af1 100644 --- a/daemon/gdm-xdmcp-display-factory.c +++ b/daemon/gdm-xdmcp-display-factory.c @@ -2095,60 +2095,62 @@ on_display_status_changed (GdmDisplay *display, gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory)); break; case GDM_DISPLAY_FAILED: gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory)); break; case GDM_DISPLAY_UNMANAGED: if (session != NULL) { g_signal_handlers_disconnect_by_func (G_OBJECT (session), G_CALLBACK (on_client_disconnected), display); } break; case GDM_DISPLAY_PREPARED: break; case GDM_DISPLAY_MANAGED: if (session != NULL) { g_signal_connect_object (G_OBJECT (session), "client-disconnected", G_CALLBACK (on_client_disconnected), display, G_CONNECT_SWAPPED); g_signal_connect_object (G_OBJECT (session), "disconnected", G_CALLBACK (on_client_disconnected), display, G_CONNECT_SWAPPED); } break; default: g_assert_not_reached (); break; } + + g_clear_object (&launch_environment); } static GdmDisplay * gdm_xdmcp_display_create (GdmXdmcpDisplayFactory *factory, const char *hostname, GdmAddress *address, int displaynum) { GdmDisplay *display; GdmDisplayStore *store; gboolean use_chooser; g_debug ("GdmXdmcpDisplayFactory: Creating xdmcp display for %s:%d", hostname ? hostname : "(null)", displaynum); use_chooser = FALSE; if (factory->priv->honor_indirect) { IndirectClient *ic; ic = indirect_client_lookup (factory, address); /* This was an indirect thingie and nothing was yet chosen, * use a chooser */ if (ic != NULL && ic->chosen_address == NULL) { use_chooser = TRUE; } } if (use_chooser) { display = gdm_xdmcp_chooser_display_new (hostname, -- 2.26.2