summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2019-10-25 09:27:15 -0400
committerRay Strode <rstrode@redhat.com>2021-04-12 16:57:53 -0400
commitd7d328bbea4bd41c64e88ca38507acfe87e36b78 (patch)
tree975ff6d21e89b5783760e5c602981731e7c967f1
parente7bfb9dd88235e8251a225ef4317f9c2196a4e75 (diff)
downloadgdm-d7d328bbea4bd41c64e88ca38507acfe87e36b78.tar.gz
manager: ensure factories are stopped at shutdown
GDM doesn't currently stop it's display handling logic when it's asked to shutdown. That can lead to X servers attempting to start themsevles as GDM is tearing itself down. This commit addresses the problem adding some stop calls to the code.
-rw-r--r--daemon/gdm-local-display-factory.c15
-rw-r--r--daemon/gdm-manager.c5
2 files changed, 18 insertions, 2 deletions
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 1c7daeb1..ad128d2c 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -61,6 +61,8 @@ struct GdmLocalDisplayFactoryPrivate
guint seat_new_id;
guint seat_removed_id;
+
+ gboolean started;
};
enum {
@@ -260,6 +262,9 @@ on_display_status_changed (GdmDisplay *display,
gboolean is_local = TRUE;
int ret;
+ if (!factory->priv->started)
+ return;
+
num = -1;
gdm_display_get_x11_display_number (display, &num, NULL);
@@ -766,7 +771,11 @@ gdm_local_display_factory_start (GdmDisplayFactory *base_factory)
0);
gdm_local_display_factory_start_monitor (factory);
- return gdm_local_display_factory_sync_seats (factory);
+
+ gdm_local_display_factory_sync_seats (factory);
+
+ factory->priv->started = TRUE;
+ return TRUE;
}
static gboolean
@@ -788,6 +797,8 @@ gdm_local_display_factory_stop (GdmDisplayFactory *base_factory)
G_CALLBACK (on_display_removed),
factory);
+ factory->priv->started = FALSE;
+
return TRUE;
}
@@ -933,7 +944,7 @@ gdm_local_display_factory_finalize (GObject *object)
g_hash_table_destroy (factory->priv->used_display_numbers);
- gdm_local_display_factory_stop_monitor (factory);
+ gdm_local_display_factory_stop (GDM_DISPLAY_FACTORY (factory));
G_OBJECT_CLASS (gdm_local_display_factory_parent_class)->finalize (object);
}
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 1db29158..779b716b 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -1648,6 +1648,9 @@ on_display_status_changed (GdmDisplay *display,
"session-type", &session_type,
NULL);
+ if (!manager->priv->started)
+ return;
+
status = gdm_display_get_status (display);
switch (status) {
@@ -2764,6 +2767,8 @@ gdm_manager_dispose (GObject *object)
g_return_if_fail (manager->priv != NULL);
+ gdm_manager_stop (manager);
+
#ifdef HAVE_LIBXDMCP
g_clear_object (&manager->priv->xdmcp_factory);
#endif