|
|
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 |
|