From 67faed38c94085f80d8ecb41e4e7ae03966f9f47 Mon Sep 17 00:00:00 2001 From: AlmaLinux RelEng Bot Date: Sun, 28 Jun 2026 06:37:30 -0400 Subject: [PATCH] import Oracle_OSS gdm-40.1-44.0.1.el9_8 --- ...e-reuse-vt-mode-for-legacy-Xorg-mode.patch | 2 +- ...-deferred-plymouth-quit-on-session-r.patch | 113 +++++ ...r-Update-RegisterSession-dbus-method.patch | 437 ++++++++++++++++++ ...n-run-session-bus-on-non-seat0-seats.patch | 113 +---- ...ctory-Fix-user-switching-with-legacy.patch | 2 +- ...ctory-Ensure-displays-are-properly-h.patch | 2 +- ...ctory-Return-a-session-type-on-legac.patch | 2 +- ...ctory-Consider-tty-when-ensuring-dis.patch | 81 ++++ ...6-Disable-Wayland-on-Matrox-chipsets.patch | 37 ++ SPECS/gdm.spec | 22 +- 10 files changed, 699 insertions(+), 112 deletions(-) create mode 100644 SOURCES/0001-manager-Schedule-deferred-plymouth-quit-on-session-r.patch create mode 100644 SOURCES/0001-manager-Update-RegisterSession-dbus-method.patch create mode 100644 SOURCES/0005-local-display-factory-Consider-tty-when-ensuring-dis.patch create mode 100644 SOURCES/orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch diff --git a/SOURCES/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch b/SOURCES/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch index c7257b7..b4f54f6 100644 --- a/SOURCES/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch +++ b/SOURCES/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch @@ -1,7 +1,7 @@ From bcab8852cf7249a2220f6c737f7bb8a17b99249a Mon Sep 17 00:00:00 2001 From: rpm-build Date: Mon, 27 Nov 2023 15:29:09 -0500 -Subject: [PATCH 1/4] gdm-session: Force reuse vt mode for legacy Xorg mode +Subject: [PATCH 1/5] gdm-session: Force reuse vt mode for legacy Xorg mode In the legacy Xorg mode, the X session and user session are supposed to use the same VT. diff --git a/SOURCES/0001-manager-Schedule-deferred-plymouth-quit-on-session-r.patch b/SOURCES/0001-manager-Schedule-deferred-plymouth-quit-on-session-r.patch new file mode 100644 index 0000000..31c1a50 --- /dev/null +++ b/SOURCES/0001-manager-Schedule-deferred-plymouth-quit-on-session-r.patch @@ -0,0 +1,113 @@ +From 46642cb36d63687fdd52b7161b192a3ac9e18393 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Mon, 13 Apr 2026 17:06:05 +0200 +Subject: [PATCH] manager: Schedule deferred plymouth quit on session + registration + +On headless or no-monitor systems, gnome-shell can register the session +but won't register the display, leaving plymouth running indefinitely. +That makes the system unusable because it didn't reach graphical.target. + +Schedule a deferred plymouth quit when RegisterSession is called on a +local display, using the same REGISTER_DISPLAY_TIMEOUT (10s) as the +session wrappers. If RegisterDisplay arrives first, the timeout is +cancelled and plymouth is quit immediately with transition as before. + +Part-of: +--- + daemon/gdm-manager.c | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 2f1b78a..b5685cd 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -94,6 +94,7 @@ struct GdmManagerPrivate + + #ifdef WITH_PLYMOUTH + guint plymouth_is_running : 1; ++ guint plymouth_quit_timeout_id; + #endif + guint did_automatic_login : 1; + }; +@@ -207,6 +208,21 @@ plymouth_quit_without_transition (void) + standard_error?: ""); + } + } ++ ++static gboolean ++plymouth_quit_timeout_cb (gpointer user_data) ++{ ++ GdmManager *manager = user_data; ++ ++ manager->priv->plymouth_quit_timeout_id = 0; ++ ++ if (manager->priv->plymouth_is_running) { ++ plymouth_quit_without_transition (); ++ manager->priv->plymouth_is_running = FALSE; ++ } ++ ++ return G_SOURCE_REMOVE; ++} + #endif + + static char * +@@ -843,6 +859,23 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + "session-registered", TRUE, + NULL); + ++#ifdef WITH_PLYMOUTH ++ if (self->priv->plymouth_is_running) { ++ gboolean display_is_local = FALSE; ++ ++ g_object_get (G_OBJECT (display), ++ "is-local", &display_is_local, ++ NULL); ++ ++ if (display_is_local && self->priv->plymouth_quit_timeout_id == 0) { ++ self->priv->plymouth_quit_timeout_id = ++ g_timeout_add_seconds (REGISTER_DISPLAY_TIMEOUT, ++ plymouth_quit_timeout_cb, ++ self); ++ } ++ } ++#endif ++ + gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), + invocation); + +@@ -1647,6 +1680,7 @@ on_display_status_changed (GdmDisplay *display, + if (status == GDM_DISPLAY_MANAGED && quit_plymouth) { + plymouth_quit_with_transition (); + manager->priv->plymouth_is_running = FALSE; ++ g_clear_handle_id (&manager->priv->plymouth_quit_timeout_id, g_source_remove); + } + #endif + break; +@@ -1659,6 +1693,7 @@ on_display_status_changed (GdmDisplay *display, + if (quit_plymouth) { + plymouth_quit_without_transition (); + manager->priv->plymouth_is_running = FALSE; ++ g_clear_handle_id (&manager->priv->plymouth_quit_timeout_id, g_source_remove); + } + #endif + +@@ -2620,6 +2655,10 @@ gdm_manager_stop (GdmManager *manager) + } + #endif + ++#ifdef WITH_PLYMOUTH ++ g_clear_handle_id (&manager->priv->plymouth_quit_timeout_id, g_source_remove); ++#endif ++ + manager->priv->started = FALSE; + } + +@@ -2647,6 +2686,7 @@ gdm_manager_start (GdmManager *manager) + if (!manager->priv->show_local_greeter && manager->priv->plymouth_is_running) { + plymouth_quit_without_transition (); + manager->priv->plymouth_is_running = FALSE; ++ g_clear_handle_id (&manager->priv->plymouth_quit_timeout_id, g_source_remove); + } + #endif + if (manager->priv->xdmcp_factory != NULL) { diff --git a/SOURCES/0001-manager-Update-RegisterSession-dbus-method.patch b/SOURCES/0001-manager-Update-RegisterSession-dbus-method.patch new file mode 100644 index 0000000..38d95af --- /dev/null +++ b/SOURCES/0001-manager-Update-RegisterSession-dbus-method.patch @@ -0,0 +1,437 @@ +From ecc9ab663cd698faa2eef596789f43df50976534 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Tue, 3 Feb 2026 14:29:18 +0100 +Subject: [PATCH 1/2] manager: Add RegisterDisplay again + +1. RegisterSession is used to record a session login. It should be + called when the new session is started. +2. RegisterDisplay is used to terminate pending greeters and plymouth + to reach graphical.target. It should be called once the new session + completes its graphics startup. + +RegisterSession was trying to do both before new session startup was completed. +This had a potential issue: the new session is setting up while the greeter +session is tearing down leading to configuration conflicts. + +Fixes: deeb4b8aba46e37a1f6dcb85252ed713183cb170 ("manager: Combine register +display with register session") +--- + daemon/gdm-local-display-factory.c | 8 +------ + daemon/gdm-manager.c | 38 +++++++++++++++++++++++++++--- + daemon/gdm-manager.xml | 2 ++ + 3 files changed, 38 insertions(+), 10 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index ef2ff7c..789afe7 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -518,7 +518,6 @@ on_display_status_changed (GdmDisplay *display, + char *session_class = NULL; + gboolean is_initial = TRUE; + gboolean is_local = TRUE; +- gboolean registered = FALSE; + + + if (!factory->is_started) +@@ -584,11 +583,7 @@ on_display_status_changed (GdmDisplay *display, + break; + case GDM_DISPLAY_MANAGED: + #if defined(ENABLE_USER_DISPLAY_SERVER) +- g_object_get (display, "session-registered", ®istered, NULL); +- if (registered) { +- g_debug ("GdmLocalDisplayFactory: session registered on display, looking for any background displays to kill"); +- finish_waiting_displays_on_seat (factory, "seat0"); +- } ++ finish_waiting_displays_on_seat (factory, "seat0"); + #endif + break; + case GDM_DISPLAY_WAITING_TO_FINISH: +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 9af9de0..b67d2e5 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -746,6 +746,39 @@ find_user_session_for_display (GdmManager *self, + return NULL; + } + ++static gboolean ++gdm_manager_handle_register_display (GdmDBusManager *manager, ++ GDBusMethodInvocation *invocation, ++ GVariant *details) ++{ ++ GdmManager *self = GDM_MANAGER (manager); ++ const char *sender; ++ GDBusConnection *connection; ++ GdmDisplay *display = NULL; ++ ++ sender = g_dbus_method_invocation_get_sender (invocation); ++ connection = g_dbus_method_invocation_get_connection (invocation); ++ get_display_and_details_for_bus_sender (self, connection, sender, &display, NULL, NULL, NULL, NULL, NULL, NULL, NULL); ++ ++ if (display == NULL) { ++ g_dbus_method_invocation_return_error_literal (invocation, ++ G_DBUS_ERROR, ++ G_DBUS_ERROR_ACCESS_DENIED, ++ _("No display available")); ++ ++ return G_DBUS_METHOD_INVOCATION_HANDLED; ++ } ++ ++ g_object_set (G_OBJECT (display), ++ "status", GDM_DISPLAY_MANAGED, ++ NULL); ++ ++ gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager), ++ invocation); ++ ++ return G_DBUS_METHOD_INVOCATION_HANDLED; ++} ++ + static gboolean + gdm_manager_handle_register_session (GdmDBusManager *manager, + GDBusMethodInvocation *invocation, +@@ -774,7 +807,7 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + G_DBUS_ERROR_ACCESS_DENIED, + _("No display available")); + +- return TRUE; ++ return G_DBUS_METHOD_INVOCATION_HANDLED; + } + + g_variant_iter_init (&iter, details); +@@ -808,14 +841,13 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + } + + g_object_set (G_OBJECT (display), +- "status", GDM_DISPLAY_MANAGED, + "session-registered", TRUE, + NULL); + + gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), + invocation); + +- return TRUE; ++ return G_DBUS_METHOD_INVOCATION_HANDLED; + } + + static gboolean +@@ -1264,6 +1296,7 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager + static void + manager_interface_init (GdmDBusManagerIface *interface) + { ++ interface->handle_register_display = gdm_manager_handle_register_display; + interface->handle_register_session = gdm_manager_handle_register_session; + interface->handle_open_session = gdm_manager_handle_open_session; + interface->handle_open_reauthentication_channel = gdm_manager_handle_open_reauthentication_channel; +diff --git a/daemon/gdm-manager.xml b/daemon/gdm-manager.xml +index aba079a..92ef1d0 100644 +--- a/daemon/gdm-manager.xml ++++ b/daemon/gdm-manager.xml +@@ -1,6 +1,9 @@ + + + ++ ++ ++ + + + +From d8e9406bfd6ebe3b395476ba0460f08d1db536c1 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Tue, 3 Feb 2026 14:31:39 +0100 +Subject: [PATCH 2/2] session: Call RegisterSession and RegisterDisplay from + session launchers + +RegisterSession is called when the session starts to record the login. +RegisterDisplay is called after a delay to terminate pending greeters +and plymouth once graphics have settled. + +This follows the workflow established in the previous commit where +RegisterSession and RegisterDisplay serve distinct purposes. +--- + common/gdm-common.h | 2 +- + daemon/gdm-session.c | 4 +-- + daemon/gdm-wayland-session.c | 63 ++++++++++++++++++++++-------------- + daemon/gdm-x-session.c | 47 +++++++++++++++++---------- + 4 files changed, 71 insertions(+), 45 deletions(-) + +diff --git a/common/gdm-common.h b/common/gdm-common.h +index ea012dc..96fda83 100644 +--- a/common/gdm-common.h ++++ b/common/gdm-common.h +@@ -27,7 +27,7 @@ + #include + #include + +-#define REGISTER_SESSION_TIMEOUT 10 ++#define REGISTER_DISPLAY_TIMEOUT 10 + + #define VE_IGNORE_EINTR(expr) \ + do { \ +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index 9a332d7..6b37ab7 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -2930,7 +2930,7 @@ gdm_session_start_session (GdmSession *self, + gboolean allow_remote_connections = FALSE; + char *command; + char *program; +- gboolean register_session; ++ gboolean needs_registration; + + g_return_if_fail (GDM_IS_SESSION (self)); + g_return_if_fail (self->session_conversation == NULL); +@@ -2956,7 +2956,7 @@ gdm_session_start_session (GdmSession *self, + run_launcher = TRUE; + } + +- register_session = !gdm_session_session_registers (self); ++ needs_registration = !gdm_session_session_registers (self); + + if (self->selected_program == NULL) { + gboolean run_xsession_script; +@@ -2976,13 +2976,13 @@ gdm_session_start_session (GdmSession *self, + if (run_launcher) { + if (is_x11) { + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s%s %s\"%s\"", +- register_session ? "--register-session " : "", ++ needs_registration ? "--handle-registration " : "", + run_xsession_script? "--run-script " : "", + allow_remote_connections? "--allow-remote-connections " : "", + command); + } else { + program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"%s\"", +- register_session ? "--register-session " : "", ++ needs_registration ? "--handle-registration " : "", + command); + } + } else if (run_xsession_script) { +@@ -3010,11 +3010,11 @@ gdm_session_start_session (GdmSession *self, + if (run_launcher) { + if (is_x11) { + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s\"dbus-run-session -- %s\"", +- register_session ? "--register-session " : "", ++ needs_registration ? "--handle-registration " : "", + self->selected_program); + } else { + program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"dbus-run-session -- %s\"", +- register_session ? "--register-session " : "", ++ needs_registration ? "--handle-registration " : "", + self->selected_program); + } + } else { +diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c +index d4d1edd..73d245c 100644 +--- a/daemon/gdm-wayland-session.c ++++ b/daemon/gdm-wayland-session.c +@@ -54,7 +54,7 @@ typedef struct + char *session_command; + int session_exit_status; + +- guint register_session_id; ++ guint register_display_id; + + GMainLoop *main_loop; + +@@ -404,6 +404,22 @@ wait_on_subprocesses (State *state) + } + } + ++static gboolean ++register_session (State *state) ++{ ++ g_autoptr(GError) error = NULL; ++ ++ if (!gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, ++ g_variant_new ("a{sv}", NULL), ++ state->cancellable, ++ &error)) { ++ g_warning ("Could not register session: %s", error->message); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ + static void + init_state (State **state) + { +@@ -422,7 +438,7 @@ clear_state (State **out_state) + g_clear_object (&state->session_subprocess); + g_clear_pointer (&state->environment, g_strfreev); + g_clear_pointer (&state->main_loop, g_main_loop_unref); +- g_clear_handle_id (&state->register_session_id, g_source_remove); ++ g_clear_handle_id (&state->register_display_id, g_source_remove); + *out_state = NULL; + } + +@@ -439,22 +455,16 @@ on_sigterm (State *state) + } + + static gboolean +-register_session_timeout_cb (gpointer user_data) ++register_display_timeout_cb (gpointer user_data) + { +- State *state; +- GError *error = NULL; +- +- state = (State *) user_data; ++ State *state = (State *) user_data; ++ g_autoptr(GError) error = NULL; + +- gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, +- g_variant_new ("a{sv}", NULL), +- state->cancellable, +- &error); +- +- if (error != NULL) { +- g_warning ("Could not register session: %s", error->message); +- g_error_free (error); +- } ++ if (!gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, ++ g_variant_new ("a{ss}", NULL), ++ state->cancellable, ++ &error)) ++ g_warning ("Could not display session: %s", error->message); + + return G_SOURCE_REMOVE; + } +@@ -491,10 +501,10 @@ main (int argc, + gboolean debug = FALSE; + gboolean ret; + int exit_status = EX_OK; +- static gboolean register_session = FALSE; ++ static gboolean handle_registration = FALSE; + + static GOptionEntry entries [] = { +- { "register-session", 0, 0, G_OPTION_ARG_NONE, ®ister_session, "Register session after a delay", NULL }, ++ { "handle-registration", 0, 0, G_OPTION_ARG_NONE, &handle_registration, "Handle session and display registration (fallback for non-GNOME sessions)", NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &args, "", "" }, + { NULL } + }; +@@ -561,10 +571,16 @@ main (int argc, + if (!connect_to_display_manager (state)) + goto out; + +- if (register_session) { +- g_debug ("gdm-wayland-session: Will register session in %d seconds", REGISTER_SESSION_TIMEOUT); +- state->register_session_id = g_timeout_add_seconds (REGISTER_SESSION_TIMEOUT, +- register_session_timeout_cb, ++ if (handle_registration) { ++ if (!register_session (state)) { ++ g_printerr ("Unable to register session with display manager\n"); ++ exit_status = EX_SOFTWARE; ++ goto out; ++ } ++ ++ g_debug ("gdm-wayland-session: Will register display in %d seconds", REGISTER_DISPLAY_TIMEOUT); ++ state->register_display_id = g_timeout_add_seconds (REGISTER_DISPLAY_TIMEOUT, ++ register_display_timeout_cb, + state); + } else { + g_debug ("gdm-wayland-session: Session will register itself"); +diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c +index 36b3975..be65f07 100644 +--- a/daemon/gdm-x-session.c ++++ b/daemon/gdm-x-session.c +@@ -60,7 +60,7 @@ typedef struct + char *session_command; + int session_exit_status; + +- guint register_session_id; ++ guint register_display_id; + + GMainLoop *main_loop; + +@@ -778,7 +778,7 @@ clear_state (State **out_state) + g_clear_pointer (&state->auth_file, g_free); + g_clear_pointer (&state->display_name, g_free); + g_clear_pointer (&state->main_loop, g_main_loop_unref); +- g_clear_handle_id (&state->register_session_id, g_source_remove); ++ g_clear_handle_id (&state->register_display_id, g_source_remove); + *out_state = NULL; + } + +@@ -795,24 +795,34 @@ on_sigterm (State *state) + } + + static gboolean +-register_session_timeout_cb (gpointer user_data) ++register_display_timeout_cb (gpointer user_data) + { +- State *state; +- GError *error = NULL; ++ State *state = (State *) user_data; ++ g_autoptr(GError) error = NULL; + +- state = (State *) user_data; ++ if (!gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, ++ g_variant_new ("a{ss}", NULL), ++ state->cancellable, ++ &error)) ++ g_warning ("Could not register display: %s", error->message); + +- gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, +- g_variant_new ("a{sv}", NULL), +- state->cancellable, +- &error); ++ return G_SOURCE_REMOVE; ++} + +- if (error != NULL) { ++static gboolean ++register_session (State *state) ++{ ++ g_autoptr(GError) error = NULL; ++ ++ if (!gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, ++ g_variant_new ("a{sv}", NULL), ++ state->cancellable, ++ &error)) { + g_warning ("Could not register session: %s", error->message); +- g_error_free (error); ++ return FALSE; + } + +- return G_SOURCE_REMOVE; ++ return TRUE; + } + + static gboolean +@@ -849,12 +859,12 @@ main (int argc, + gboolean debug = FALSE; + gboolean ret; + int exit_status = EX_OK; +- static gboolean register_session = FALSE; ++ static gboolean handle_registration = FALSE; + + static GOptionEntry entries [] = { + { "run-script", 'r', 0, G_OPTION_ARG_NONE, &run_script, N_("Run program through /etc/gdm/Xsession wrapper script"), NULL }, + { "allow-remote-connections", 'a', 0, G_OPTION_ARG_NONE, &allow_remote_connections, N_("Listen on TCP socket"), NULL }, +- { "register-session", 0, 0, G_OPTION_ARG_NONE, ®ister_session, "Register session after a delay", NULL }, ++ { "handle-registration", 0, 0, G_OPTION_ARG_NONE, &handle_registration, "Handle session and display registration (fallback for non-GNOME sessions)", NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &args, "", "" }, + { NULL } + }; +@@ -937,10 +947,16 @@ main (int argc, + goto out; + } + +- if (register_session) { +- g_debug ("gdm-x-session: Will register session in %d seconds", REGISTER_SESSION_TIMEOUT); +- state->register_session_id = g_timeout_add_seconds (REGISTER_SESSION_TIMEOUT, +- register_session_timeout_cb, ++ if (handle_registration) { ++ if (!register_session (state)) { ++ g_printerr ("Unable to register session with display manager\n"); ++ exit_status = EX_SOFTWARE; ++ goto out; ++ } ++ ++ g_debug ("gdm-x-session: Will register display in %d seconds", REGISTER_DISPLAY_TIMEOUT); ++ state->register_display_id = g_timeout_add_seconds (REGISTER_DISPLAY_TIMEOUT, ++ register_display_timeout_cb, + state); + } else { + g_debug ("gdm-x-session: Session will register itself"); diff --git a/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch b/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch index 000b95c..23a1cba 100644 --- a/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch +++ b/SOURCES/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch @@ -13,70 +13,20 @@ seats get their own session bus. 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index a65fa0f9..f13b54af 100644 +index 71c0633..3834d40 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c -@@ -2864,119 +2864,128 @@ on_start_program_cb (GdmDBusWorker *worker, - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) || - g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - - self = conversation->session; - service_name = conversation->service_name; - - if (worked) { - self->session_pid = pid; - self->session_conversation = conversation; - - g_debug ("GdmSession: Emitting 'session-started' signal with pid '%d'", pid); - g_signal_emit (self, signals[SESSION_STARTED], 0, service_name, pid); - } else { - gdm_session_stop_conversation (self, service_name); - - g_debug ("GdmSession: Emitting 'session-start-failed' signal"); - g_signal_emit (self, signals[SESSION_START_FAILED], 0, service_name, error->message); - } - } - - void - gdm_session_start_session (GdmSession *self, - const char *service_name) - { - GdmSessionConversation *conversation; - GdmSessionDisplayMode display_mode; +@@ -3060,6 +3060,7 @@ gdm_session_start_session (GdmSession *self, gboolean is_x11 = TRUE; gboolean run_launcher = FALSE; gboolean allow_remote_connections = FALSE; + gboolean run_separate_bus = FALSE; char *command; char *program; - gboolean register_session; + gboolean needs_registration; +@@ -3090,6 +3091,10 @@ gdm_session_start_session (GdmSession *self, - g_return_if_fail (GDM_IS_SESSION (self)); - g_return_if_fail (self->session_conversation == NULL); - - conversation = find_conversation_by_name (self, service_name); - - if (conversation == NULL) { - g_warning ("GdmSession: Tried to start session of " - "nonexistent conversation %s", service_name); - return; - } - - stop_all_other_conversations (self, conversation, FALSE); - - display_mode = gdm_session_get_display_mode (self); - - #ifdef ENABLE_WAYLAND_SUPPORT - is_x11 = g_strcmp0 (self->session_type, "wayland") != 0; - #endif - - if (display_mode == GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED || - display_mode == GDM_SESSION_DISPLAY_MODE_NEW_VT) { - run_launcher = TRUE; - } - - register_session = !gdm_session_session_registers (self); + needs_registration = !gdm_session_session_registers (self); + if (g_strcmp0 (self->display_seat_id, "seat0") != 0 && !run_launcher) { + run_separate_bus = TRUE; @@ -85,28 +35,7 @@ index a65fa0f9..f13b54af 100644 if (self->selected_program == NULL) { gboolean run_xsession_script; - command = get_session_command (self); - - run_xsession_script = !gdm_session_bypasses_xsession (self); - - if (self->display_is_local) { - gboolean disallow_tcp = TRUE; - gdm_settings_direct_get_boolean (GDM_KEY_DISALLOW_TCP, &disallow_tcp); - allow_remote_connections = !disallow_tcp; - } else { - allow_remote_connections = TRUE; - } - - if (run_launcher) { - if (is_x11) { - program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s%s %s\"%s\"", - register_session ? "--register-session " : "", - run_xsession_script? "--run-script " : "", - allow_remote_connections? "--allow-remote-connections " : "", - command); - } else { - program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"%s\"", - register_session ? "--register-session " : "", +@@ -3118,7 +3123,11 @@ gdm_session_start_session (GdmSession *self, command); } } else if (run_xsession_script) { @@ -119,33 +48,3 @@ index a65fa0f9..f13b54af 100644 } else { program = g_strdup (command); } - - g_free (command); - } else { - /* FIXME: - * Always use a separate DBus bus for each greeter session. - * Firstly, this means that if we run multiple greeter session - * (which we really should not do, but have to currently), then - * each one will get its own DBus session bus. - * But, we also explicitly do this for seat0, because that way - * it cannot make use of systemd to run the GNOME session. This - * prevents the session lookup logic from getting confused. - * This has a similar effect as passing --builtin to gnome-session. - * - * We really should not be doing this. But the fix is to use - * separate dynamically created users and that requires some - * major refactorings. - */ - if (run_launcher) { - if (is_x11) { - program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s\"dbus-run-session -- %s\"", - register_session ? "--register-session " : "", - self->selected_program); - } else { - program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"dbus-run-session -- %s\"", - register_session ? "--register-session " : "", - self->selected_program); - } --- -2.37.3 - diff --git a/SOURCES/0002-local-display-factory-Fix-user-switching-with-legacy.patch b/SOURCES/0002-local-display-factory-Fix-user-switching-with-legacy.patch index dad68eb..a3c3d05 100644 --- a/SOURCES/0002-local-display-factory-Fix-user-switching-with-legacy.patch +++ b/SOURCES/0002-local-display-factory-Fix-user-switching-with-legacy.patch @@ -1,7 +1,7 @@ From 510566699c480226b189215c6222f7e72979baf8 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 22 May 2024 14:05:20 -0400 -Subject: [PATCH 2/4] local-display-factory: Fix user switching with legacy +Subject: [PATCH 2/5] local-display-factory: Fix user switching with legacy xorg legacy-xorg sessions currently fail to completely user switch. diff --git a/SOURCES/0003-local-display-factory-Ensure-displays-are-properly-h.patch b/SOURCES/0003-local-display-factory-Ensure-displays-are-properly-h.patch index a3896c4..ba7236e 100644 --- a/SOURCES/0003-local-display-factory-Ensure-displays-are-properly-h.patch +++ b/SOURCES/0003-local-display-factory-Ensure-displays-are-properly-h.patch @@ -1,7 +1,7 @@ From de73b654cd1b726b905a9bf3238c7eaabfe465d5 Mon Sep 17 00:00:00 2001 From: Joan Torres Date: Fri, 13 Jun 2025 13:05:07 +0200 -Subject: [PATCH 3/4] local-display-factory: Ensure displays are properly +Subject: [PATCH 3/5] local-display-factory: Ensure displays are properly handled on status change 1. There are some cases where a display will change its status from any diff --git a/SOURCES/0004-local-display-factory-Return-a-session-type-on-legac.patch b/SOURCES/0004-local-display-factory-Return-a-session-type-on-legac.patch index 6c226a5..5e6304d 100644 --- a/SOURCES/0004-local-display-factory-Return-a-session-type-on-legac.patch +++ b/SOURCES/0004-local-display-factory-Return-a-session-type-on-legac.patch @@ -1,7 +1,7 @@ From 8bcb9f43c203ab4818381cd707128eac74ab958d Mon Sep 17 00:00:00 2001 From: Joan Torres Date: Fri, 13 Jun 2025 12:56:41 +0200 -Subject: [PATCH 4/4] local-display-factory: Return a session type on +Subject: [PATCH 4/5] local-display-factory: Return a session type on legacy-xorg On legacy-xorg, there's graphic support through Xorg. diff --git a/SOURCES/0005-local-display-factory-Consider-tty-when-ensuring-dis.patch b/SOURCES/0005-local-display-factory-Consider-tty-when-ensuring-dis.patch new file mode 100644 index 0000000..655528a --- /dev/null +++ b/SOURCES/0005-local-display-factory-Consider-tty-when-ensuring-dis.patch @@ -0,0 +1,81 @@ +From ce2a019ad18e4e11eb45218fa5a86055fa8a1533 Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Mon, 1 Jun 2026 20:04:50 +0200 +Subject: [PATCH 5/5] local-display-factory: Consider tty when ensuring display on seat + +In "leagcy-xorg" mode there can be cases where ensure_display() is called +because some new device was inserted or seat properties changed... in +those cases we were creating a new display when active_vt != GDM_INITIAL_VT while +there was already a display on that vt. + +To fix that, check if there's already a display in the active_vt. +--- + daemon/gdm-local-display-factory.c | 35 +++++++++++++++--------------- + 1 file changed, 17 insertions(+), 18 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 3a35018..393437c 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -110,6 +110,10 @@ static gboolean lookup_by_session_id (const char *id, + GdmDisplay *display, + gpointer user_data); + ++static gboolean lookup_by_tty (const char *id, ++ GdmDisplay *display, ++ gpointer user_data); ++ + G_DEFINE_TYPE (GdmLocalDisplayFactory, gdm_local_display_factory, GDM_TYPE_DISPLAY_FACTORY) + + GQuark +@@ -674,18 +678,14 @@ lookup_prepared_display_by_seat_id (const char *id, + } + + static gboolean +-lookup_managed_display_by_seat_id (const char *id, +- GdmDisplay *display, +- gpointer user_data) ++lookup_managed_display_by_tty (const char *id, ++ GdmDisplay *display, ++ gpointer user_data) + { +- int status; +- +- status = gdm_display_get_status (display); +- +- if (status != GDM_DISPLAY_MANAGED) ++ if (gdm_display_get_status (display) != GDM_DISPLAY_MANAGED) + return FALSE; + +- return lookup_by_seat_id (id, display, user_data); ++ return lookup_by_tty (id, display, user_data); + } + + #ifdef HAVE_UDEV +@@ -919,15 +919,14 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, + + if (is_seat0) { + if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) { +- GdmDisplay *initial_display = NULL; +- +- display = gdm_display_store_find (store, lookup_managed_display_by_seat_id, (gpointer) seat_id); +- initial_display = gdm_display_store_find (store, lookup_initial_display, (gpointer) NULL); +- +- if (initial_display == NULL || factory->active_vt != GDM_INITIAL_VT) +- display = NULL; +- +- is_initial = initial_display == NULL; ++ display = gdm_display_store_find (store, lookup_initial_display, (gpointer) NULL); ++ if (display == NULL) { ++ is_initial = TRUE; ++ } else if (factory->active_vt != 0 && factory->active_vt != GDM_INITIAL_VT) { ++ g_autofree char *tty = g_strdup_printf ("tty%u", factory->active_vt); ++ display = gdm_display_store_find (store, lookup_managed_display_by_tty, (gpointer) tty); ++ is_initial = FALSE; ++ } + } else { + display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id); + is_initial = TRUE; +-- +2.54.0 + diff --git a/SOURCES/orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch b/SOURCES/orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch new file mode 100644 index 0000000..c09cda6 --- /dev/null +++ b/SOURCES/orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch @@ -0,0 +1,37 @@ +From 37c6a13fd6b605206120f99bc145d1a65a1404d1 Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Tue, 4 Apr 2023 07:40:14 -0700 +Subject: [PATCH] Disable Wayland on Matrox chipsets + + +Orabug: 34816116 +Signed-off-by: Alex Burmashev +Signed-off-by: Darren Archibald +--- + data/61-gdm.rules.in | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in +index 7fb3d61..81a9269 100644 +--- a/data/61-gdm.rules.in ++++ b/data/61-gdm.rules.in +@@ -18,6 +18,16 @@ ATTR{vendor}=="0x1234", ATTR{device}=="0x1111", RUN+="/usr/bin/touch /run/udev/g + # disable Wayland on Hi1710 chipsets + ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", GOTO="gdm_disable_wayland" + ++# disable Wayland on Matrox chipsets ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0522", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0524", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0530", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0532", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0533", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0534", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0536", GOTO="gdm_disable_wayland" ++ATTR{vendor}=="0x102b", ATTR{device}=="0x0538", GOTO="gdm_disable_wayland" ++ + LABEL="gdm_pci_device_end" + + # disable Wayland if modesetting is disabled +-- +2.31.1 + diff --git a/SPECS/gdm.spec b/SPECS/gdm.spec index 6e32efb..191280b 100644 --- a/SPECS/gdm.spec +++ b/SPECS/gdm.spec @@ -11,7 +11,7 @@ Name: gdm Epoch: 1 Version: 40.1 -Release: 42%{?dist} +Release: 44.0.1%{?dist} Summary: The GNOME Display Manager License: GPLv2+ @@ -57,6 +57,7 @@ Patch100001: 0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch Patch100002: 0002-local-display-factory-Fix-user-switching-with-legacy.patch Patch100003: 0003-local-display-factory-Ensure-displays-are-properly-h.patch Patch100004: 0004-local-display-factory-Return-a-session-type-on-legac.patch +Patch100005: 0005-local-display-factory-Consider-tty-when-ensuring-dis.patch Patch110001: 0001-display-Add-new-FAILING-state.patch Patch110002: 0002-manager-Quit-plymouth-at-first-sign-of-failure.patch @@ -71,6 +72,8 @@ Patch140001: 0001-session-Fix-memory-leak-on-new-outside-connection.patch Patch150001: 0001-libgdm-Don-t-collect-twice-sessions-on-usr-share.patch Patch160001: 0001-Revert-hack-that-quits-plymouth-late.patch +Patch160002: 0001-manager-Update-RegisterSession-dbus-method.patch +Patch160003: 0001-manager-Schedule-deferred-plymouth-quit-on-session-r.patch Patch170001: 0001-session-record-Rework-wtmp-utmp-btmp-fields.patch @@ -88,6 +91,7 @@ Patch99910001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch Patch99930001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch Patch99950001: 0001-data-Disable-network-configuration-on-login-screen.patch +Patch1000000: orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch BuildRequires: accountsservice-devel BuildRequires: audit-libs-devel >= %{libauditver} @@ -377,6 +381,22 @@ dconf update || : %{_libdir}/pkgconfig/gdm-pam-extensions.pc %changelog +* Tue Jun 23 2026 EL Errata - 40.1-44.0.1 +- Disable Wayland on Matrox [Orabug: 34816116] + +* Mon Jun 1 2026 Joan Torres Lopez - 40.1-44 +- Create display in "legacy-xorg" mode checking displays in tty + Resolves: https://redhat.atlassian.net/browse/RHEL-180820 + +* Fri May 29 2026 Tomas Pelka - 40.1-43.1 +- retrigger new build in correct target + Resolves: https://redhat.atlassian.net/browse/RHEL-178706 + +* Mon May 25 2026 Joan Torres Lopez - 40.1-43 +- Update how GDM handles Registering session/display + to properly terminate plymouth + Resolves: https://redhat.atlassian.net/browse/RHEL-178706 + * Fri Mar 6 2026 Joan Torres Lopez - 40.1-42 - Terminate conflicting sesions started outside of GDM Resolves: RHEL-4108