Blob Blame History Raw
From f5acee2766c05403235c06da6b1bb68af744da79 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 25 Sep 2018 14:30:16 -0400
Subject: [PATCH 36/51] local-display-factory: Remove same VT so don't switch
 check

We avoid changing to the login screen vt if we're already on it,
but the call is racy since we react to vt changes concurrently
with logind (who we query for the active vt).

This check drops the active vt check since it's pointless and
getting in the way.
---
 daemon/gdm-local-display-factory.c | 39 ++++++++++--------------------
 1 file changed, 13 insertions(+), 26 deletions(-)

diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 8e46dbca2..be7b43cff 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -410,103 +410,90 @@ lookup_by_seat_id (const char *id,
         res = g_strcmp0 (current, looking_for) == 0;
 
         g_free(current);
 
         return res;
 }
 
 static gboolean
 lookup_prepared_display_by_seat_id (const char *id,
                                     GdmDisplay *display,
                                     gpointer    user_data)
 {
         int status;
 
         status = gdm_display_get_status (display);
 
         if (status != GDM_DISPLAY_PREPARED)
                 return FALSE;
 
         return lookup_by_seat_id (id, display, user_data);
 }
 
 static GdmDisplay *
 create_display (GdmLocalDisplayFactory *factory,
                 const char             *seat_id,
                 const char             *session_type,
                 gboolean                initial)
 {
         GdmDisplayStore *store;
         GdmDisplay      *display = NULL;
-        char            *active_session_id = NULL;
-        int              ret;
+        g_autofree char *login_session_id = NULL;
 
         g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
                  session_type? : "X11", seat_id);
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
 
         if (sd_seat_can_multi_session (seat_id))
                 display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
         else
                 display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
 
         /* Ensure we don't create the same display more than once */
         if (display != NULL) {
                 g_debug ("GdmLocalDisplayFactory: display already created");
                 return NULL;
         }
 
-        ret = sd_seat_get_active (seat_id, &active_session_id, NULL);
-
-        if (ret == 0) {
-                char *login_session_id = NULL;
-
-                /* If we already have a login window, switch to it */
-                if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
-                        GdmDisplay *display;
-
-                        display = gdm_display_store_find (store,
-                                                          lookup_by_session_id,
-                                                          (gpointer) login_session_id);
-                        if (display != NULL && gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
-                                if (g_strcmp0 (active_session_id, login_session_id) != 0) {
-                                        g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
-                                                 login_session_id);
-                                        gdm_activate_session_by_id (factory->priv->connection, seat_id, login_session_id);
-                                }
-                                g_clear_pointer (&login_session_id, g_free);
-                                g_clear_pointer (&active_session_id, g_free);
-                                return NULL;
-                        }
-                        g_clear_pointer (&login_session_id, g_free);
+        /* If we already have a login window, switch to it */
+        if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
+                GdmDisplay *display;
+
+                display = gdm_display_store_find (store,
+                                                  lookup_by_session_id,
+                                                  (gpointer) login_session_id);
+                if (display != NULL && gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
+                        g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
+                                 login_session_id);
+                        gdm_activate_session_by_id (factory->priv->connection, seat_id, login_session_id);
+                        return NULL;
                 }
-                g_clear_pointer (&active_session_id, g_free);
         }
 
         g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
 
 #ifdef ENABLE_USER_DISPLAY_SERVER
         if (g_strcmp0 (seat_id, "seat0") == 0) {
                 display = gdm_local_display_new ();
                 if (session_type != NULL) {
                         g_object_set (G_OBJECT (display), "session-type", session_type, NULL);
                 }
         }
 #endif
 
         if (display == NULL) {
                 guint32 num;
 
                 num = take_next_display_number (factory);
 
                 display = gdm_legacy_display_new (num);
         }
 
         g_object_set (display, "seat-id", seat_id, NULL);
         g_object_set (display, "is-initial", initial, NULL);
 
         store_display (factory, display);
 
         /* let store own the ref */
         g_object_unref (display);
 
         if (! gdm_display_manage (display)) {
-- 
2.27.0