diff options
author | Ray Strode <rstrode@redhat.com> | 2019-10-25 09:27:15 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2021-04-12 16:57:53 -0400 |
commit | d7d328bbea4bd41c64e88ca38507acfe87e36b78 (patch) | |
tree | 975ff6d21e89b5783760e5c602981731e7c967f1 | |
parent | e7bfb9dd88235e8251a225ef4317f9c2196a4e75 (diff) | |
download | gdm-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.c | 15 | ||||
-rw-r--r-- | daemon/gdm-manager.c | 5 |
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 |