Blob Blame History Raw
From 299a0981f4e9fc02716d64abf5e5e692e2ad2951 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Fri, 3 Aug 2018 16:50:36 -0400
Subject: [PATCH 13/51] local-display-factory: ensure non-seat0 codepath
 doesn't affect seat0

create_display currently bails in some cases if any display is running
on the seat.  That's the right thing to do on seats other than seat0,
but wrong for seat0 (which an have multiple sessions at the same
time).

To ensure we never hit the case for seat0, add a call to check if
the passed seat is multi-session capable.
---
 daemon/gdm-local-display-factory.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 0e454c880..7f7735ca1 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -373,61 +373,61 @@ lookup_by_seat_id (const char *id,
 }
 
 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;
 
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
 
         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)) {
                         if (g_strcmp0 (active_session_id, login_session_id) != 0) {
                                 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 (&active_session_id, g_free);
-        } else {
+        } else if (!sd_seat_can_multi_session (seat_id)) {
                 /* Ensure we don't create the same display more than once */
                 display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
 
                 if (display != NULL) {
                         return NULL;
                 }
         }
 
         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);
 
-- 
2.27.0