Blame SOURCES/0004-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch

6b1540
From dfca67899ea33da08d3aa9e84c1b4487991adad0 Mon Sep 17 00:00:00 2001
890c66
From: Ray Strode <rstrode@redhat.com>
6b1540
Date: Thu, 7 Oct 2021 15:34:27 -0400
6b1540
Subject: [PATCH 4/4] local-display-factory: Don't crash if Xorg and Wayland
6b1540
 are both unavailable
890c66
6b1540
At the moment if Wayland doesn't work, the login screen will fall back
6b1540
to Xorg, and if Xorg doesn't work the login screen will fall back to
6b1540
Wayland.
890c66
6b1540
But if the fall back choice is disabled explicitly, GDM will just crash.
890c66
6b1540
This commit fixes the crash.
6b1540
6b1540
Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/739
890c66
---
6b1540
 daemon/gdm-local-display-factory.c | 9 +++++++--
6b1540
 1 file changed, 7 insertions(+), 2 deletions(-)
890c66
890c66
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
6b1540
index eba38671..120847f9 100644
890c66
--- a/daemon/gdm-local-display-factory.c
890c66
+++ b/daemon/gdm-local-display-factory.c
6b1540
@@ -651,62 +651,67 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
6b1540
         gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled);
6b1540
 
3b7e70
         preferred_display_server = get_preferred_display_server (factory);
890c66
 
3b7e70
         if (g_strcmp0 (preferred_display_server, "none") == 0) {
3b7e70
                g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display");
3b7e70
                return;
3b7e70
         }
3b7e70
 
3b7e70
         ret = sd_seat_can_graphical (seat_id);
890c66
 
3b7e70
         if (ret < 0) {
3b7e70
                 g_critical ("Failed to query CanGraphical information for seat %s", seat_id);
3b7e70
                 return;
3b7e70
         }
890c66
 
3b7e70
         if (ret == 0) {
3b7e70
                 g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics");
3b7e70
                 seat_supports_graphics = FALSE;
3b7e70
         } else {
3b7e70
                 g_debug ("GdmLocalDisplayFactory: System supports graphics");
3b7e70
                 seat_supports_graphics = TRUE;
3b7e70
         }
890c66
 
3b7e70
         if (g_strcmp0 (seat_id, "seat0") == 0) {
3b7e70
                 is_seat0 = TRUE;
3b7e70
 
3b7e70
                 falling_back = factory->num_failures > 0;
6b1540
                 session_types = gdm_local_display_factory_get_session_types (factory, falling_back);
3b7e70
 
6b1540
-                g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s",
6b1540
-                         session_types[0], falling_back? " fallback" : "");
6b1540
+                if (session_types == NULL) {
6b1540
+                        g_debug ("GdmLocalDisplayFactory: Both Wayland and Xorg are unavailable");
6b1540
+                        seat_supports_graphics = FALSE;
6b1540
+                } else {
6b1540
+                        g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s",
6b1540
+                                 session_types[0], falling_back? " fallback" : "");
3b7e70
+                }
3b7e70
         } else {
3b7e70
                 is_seat0 = FALSE;
890c66
 
3b7e70
                 g_debug ("GdmLocalDisplayFactory: New displays on seat %s will use X11 fallback", seat_id);
3b7e70
                 /* Force legacy X11 for all auxiliary seats */
3b7e70
                 seat_supports_graphics = TRUE;
6b1540
                 session_types = g_strdupv ((char **) legacy_session_types);
890c66
         }
890c66
 
3b7e70
         /* For seat0, we have a fallback logic to still try starting it after
3b7e70
          * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if
3b7e70
          * CanGraphical is unset.
3b7e70
          * This is ugly, but it means we'll come up eventually in some
3b7e70
          * scenarios where no master device is present.
3b7e70
          * Note that we'll force an X11 fallback even though there might be
3b7e70
          * cases where an wayland capable device is present and simply not marked as
3b7e70
          * master-of-seat. In these cases, this should likely be fixed in the
3b7e70
          * udev rules.
3b7e70
          *
3b7e70
          * At the moment, systemd always sets CanGraphical for non-seat0 seats.
3b7e70
          * This is because non-seat0 seats are defined by having master-of-seat
3b7e70
          * set. This means we can avoid the fallback check for non-seat0 seats,
3b7e70
          * which simplifies the code.
3b7e70
          */
3b7e70
         if (is_seat0) {
3b7e70
                 if (!seat_supports_graphics) {
3b7e70
                         if (!factory->seat0_graphics_check_timed_out) {
3b7e70
                                 if (factory->seat0_graphics_check_timeout_id == 0) {
3b7e70
                                         g_debug ("GdmLocalDisplayFactory: seat0 doesn't yet support graphics.  Waiting %d seconds to try again.", SEAT0_GRAPHICS_CHECK_TIMEOUT);
3b7e70
                                         factory->seat0_graphics_check_timeout_id = g_timeout_add_seconds (SEAT0_GRAPHICS_CHECK_TIMEOUT,
890c66
-- 
6b1540
2.34.1
890c66