[gdm/rhel-7.9: 23/51] manager: ensure factories are stopped at shutdown




commit d7d328bbea4bd41c64e88ca38507acfe87e36b78
Author: Ray Strode <rstrode redhat com>
Date:   Fri Oct 25 09:27:15 2019 -0400

    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.

 daemon/gdm-local-display-factory.c | 15 +++++++++++++--
 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 1c7daeb14..ad128d2c8 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 1db291587..779b716be 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]