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

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