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