From e9dc7113942146f26745494f6177d49fb9b97efb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 3 Aug 2018 16:50:36 -0400 Subject: [PATCH 13/48] 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.26.0