From 425fca4ce449d095bd0c755fba2ee962b76ad270 Mon Sep 17 00:00:00 2001 From: Andrew Lukoshko Date: Thu, 7 Aug 2025 10:54:18 +0000 Subject: [PATCH] import OL gdm-40.1-30.0.1.el9_6 --- .../0001-display-Add-new-FAILING-state.patch | 57 ++++++ ...e-reuse-vt-mode-for-legacy-Xorg-mode.patch | 2 +- ...ctory-Stall-startup-until-main-graph.patch | 16 +- ...emory-leak-on-new-outside-connection.patch | 96 ++++++++++ ...ttings-Explicitly-cache-remote-users.patch | 45 +++++ ...ctory-Fix-user-switching-with-legacy.patch | 174 ++++++++++++++++++ ...it-plymouth-at-first-sign-of-failure.patch | 102 ++++++++++ ...ctory-Ensure-displays-are-properly-h.patch | 105 +++++++++++ ...-manager-Quit-plymouth-synchronously.patch | 94 ++++++++++ ...ctory-Return-a-session-type-on-legac.patch | 54 ++++++ SOURCES/gdm.sysusers | 1 + ...6-Disable-Wayland-on-Matrox-chipsets.patch | 37 ++++ SPECS/gdm.spec | 69 ++++++- 13 files changed, 835 insertions(+), 17 deletions(-) create mode 100644 SOURCES/0001-display-Add-new-FAILING-state.patch create mode 100644 SOURCES/0001-session-Fix-memory-leak-on-new-outside-connection.patch create mode 100644 SOURCES/0001-session-settings-Explicitly-cache-remote-users.patch create mode 100644 SOURCES/0002-local-display-factory-Fix-user-switching-with-legacy.patch create mode 100644 SOURCES/0002-manager-Quit-plymouth-at-first-sign-of-failure.patch create mode 100644 SOURCES/0003-local-display-factory-Ensure-displays-are-properly-h.patch create mode 100644 SOURCES/0003-manager-Quit-plymouth-synchronously.patch create mode 100644 SOURCES/0004-local-display-factory-Return-a-session-type-on-legac.patch create mode 100644 SOURCES/gdm.sysusers create mode 100644 SOURCES/orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch diff --git a/SOURCES/0001-display-Add-new-FAILING-state.patch b/SOURCES/0001-display-Add-new-FAILING-state.patch new file mode 100644 index 0000000..a8d4887 --- /dev/null +++ b/SOURCES/0001-display-Add-new-FAILING-state.patch @@ -0,0 +1,57 @@ +From f7295f73f424e22eacb940c92e43326d75c901e1 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 22 Jul 2024 14:58:47 -0400 +Subject: [PATCH 1/3] display: Add new FAILING state + +We need to be able to detect failure and quit plymouth before +reacting to the failure (and starting Xorg). + +This commit adds a new FAILING state that gets run before FAILED, +so things can be ordered properly +d# +--- + daemon/gdm-display.c | 1 + + daemon/gdm-display.h | 1 + + daemon/gdm-local-display-factory.c | 2 ++ + 3 files changed, 4 insertions(+) + +diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c +index 3446785..b8af350 100644 +--- a/daemon/gdm-display.c ++++ b/daemon/gdm-display.c +@@ -694,6 +694,7 @@ gdm_display_unmanage (GdmDisplay *self) + + if (!priv->session_registered) { + g_warning ("GdmDisplay: Session never registered, failing"); ++ _gdm_display_set_status (self, GDM_DISPLAY_FAILING); + _gdm_display_set_status (self, GDM_DISPLAY_FAILED); + } else { + _gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED); +diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h +index ef3736c..bd048cd 100644 +--- a/daemon/gdm-display.h ++++ b/daemon/gdm-display.h +@@ -36,6 +36,7 @@ typedef enum { + GDM_DISPLAY_MANAGED, + GDM_DISPLAY_WAITING_TO_FINISH, + GDM_DISPLAY_FINISHED, ++ GDM_DISPLAY_FAILING, + GDM_DISPLAY_FAILED, + } GdmDisplayStatus; + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 61b7b45..6df9e84 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -577,6 +577,8 @@ on_display_status_changed (GdmDisplay *display, + gdm_local_display_factory_sync_seats (factory); + } + break; ++ case GDM_DISPLAY_FAILING: ++ break; + case GDM_DISPLAY_FAILED: + /* leave the display number in factory->used_display_numbers + so that it doesn't get reused */ +-- +2.44.0 + 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 c2f7806..c7257b7 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] gdm-session: Force reuse vt mode for legacy Xorg mode +Subject: [PATCH 1/4] 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-local-display-factory-Stall-startup-until-main-graph.patch b/SOURCES/0001-local-display-factory-Stall-startup-until-main-graph.patch index 33a411c..d88da45 100644 --- a/SOURCES/0001-local-display-factory-Stall-startup-until-main-graph.patch +++ b/SOURCES/0001-local-display-factory-Stall-startup-until-main-graph.patch @@ -1,4 +1,4 @@ -From e5b3467412874d27c311253e3d5d7e65a61d12a4 Mon Sep 17 00:00:00 2001 +From e88779b0785fe781608b10478ae092e8fd79ae0b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 1 Mar 2022 13:25:02 -0500 Subject: [PATCH 1/4] local-display-factory: Stall startup until main graphics @@ -27,13 +27,13 @@ up and running before proceeding to start a login screen. Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/763 --- - daemon/gdm-local-display-factory.c | 164 ++++++++++++++++++++++++++--- + daemon/gdm-local-display-factory.c | 168 ++++++++++++++++++++++++++--- daemon/meson.build | 4 + meson.build | 2 + - 4 files changed, 159 insertions(+), 12 deletions(-) + 3 files changed, 162 insertions(+), 12 deletions(-) diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c -index c00e1c47..0b1d3482 100644 +index ca14c31f5..56be1d9db 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -1,100 +1,112 @@ @@ -398,7 +398,7 @@ index c00e1c47..0b1d3482 100644 } g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!"); -@@ -1138,113 +1240,151 @@ on_vt_changed (GIOChannel *source, +@@ -1138,113 +1244,151 @@ on_vt_changed (GIOChannel *source, if (factory->wait_to_finish_timeout_id != 0) { g_debug ("GdmLocalDisplayFactory: deferring previous login screen clean up operation"); g_source_remove (factory->wait_to_finish_timeout_id); @@ -551,7 +551,7 @@ index c00e1c47..0b1d3482 100644 on_display_added (GdmDisplayStore *display_store, const char *id, diff --git a/daemon/meson.build b/daemon/meson.build -index 2e61b644..41f30abe 100644 +index 2e61b6447..41f30abef 100644 --- a/daemon/meson.build +++ b/daemon/meson.build @@ -177,37 +177,41 @@ gdm_daemon_sources = files( @@ -597,7 +597,7 @@ index 2e61b644..41f30abe 100644 install_dir: get_option('sbindir') ) diff --git a/meson.build b/meson.build -index 02d609dc..05d8da41 100644 +index 02d609dc0..05d8da412 100644 --- a/meson.build +++ b/meson.build @@ -11,60 +11,61 @@ i18n = import('i18n') @@ -725,5 +725,5 @@ index 02d609dc..05d8da41 100644 subdir('chooser') endif -- -2.34.1 +2.40.0 diff --git a/SOURCES/0001-session-Fix-memory-leak-on-new-outside-connection.patch b/SOURCES/0001-session-Fix-memory-leak-on-new-outside-connection.patch new file mode 100644 index 0000000..f62151f --- /dev/null +++ b/SOURCES/0001-session-Fix-memory-leak-on-new-outside-connection.patch @@ -0,0 +1,96 @@ +From 3d67dc8e992b69c331b403b5ff7f680700392977 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Joan=20Torres=20L=C3=B3pez?= +Date: Wed, 11 Jun 2025 17:54:52 +0200 +Subject: [PATCH] session: Fix memory leak on new outside connection + +On a new outside connection some new dbus interfaces are created and +assigned as properties to session. However the assignation wasn't +considering the previous reference of these interfaces, leading to a +memory leak. + +Use g_set_object to fix it. +--- + daemon/gdm-session.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c +index 33dee7606..08ba39cf6 100644 +--- a/daemon/gdm-session.c ++++ b/daemon/gdm-session.c +@@ -1840,7 +1840,8 @@ static void + export_user_verifier_interface (GdmSession *self, + GDBusConnection *connection) + { +- GdmDBusUserVerifier *user_verifier_interface; ++ g_autoptr (GdmDBusUserVerifier) user_verifier_interface = NULL; ++ + user_verifier_interface = GDM_DBUS_USER_VERIFIER (gdm_dbus_user_verifier_skeleton_new ()); + + g_object_set_data (G_OBJECT (connection), "gdm-session", self); +@@ -1871,14 +1872,14 @@ export_user_verifier_interface (GdmSession *self, + GDM_SESSION_DBUS_OBJECT_PATH, + NULL); + +- self->user_verifier_interface = user_verifier_interface; ++ g_set_object (&self->user_verifier_interface, user_verifier_interface); + } + + static void + export_greeter_interface (GdmSession *self, + GDBusConnection *connection) + { +- GdmDBusGreeter *greeter_interface; ++ g_autoptr (GdmDBusGreeter) greeter_interface = NULL; + + greeter_interface = GDM_DBUS_GREETER (gdm_dbus_greeter_skeleton_new ()); + +@@ -1912,8 +1913,7 @@ export_greeter_interface (GdmSession *self, + GDM_SESSION_DBUS_OBJECT_PATH, + NULL); + +- self->greeter_interface = greeter_interface; +- ++ g_set_object (&self->greeter_interface, greeter_interface); + } + + static gboolean +@@ -1931,7 +1931,7 @@ static void + export_remote_greeter_interface (GdmSession *self, + GDBusConnection *connection) + { +- GdmDBusRemoteGreeter *remote_greeter_interface; ++ g_autoptr (GdmDBusRemoteGreeter) remote_greeter_interface = NULL; + + remote_greeter_interface = GDM_DBUS_REMOTE_GREETER (gdm_dbus_remote_greeter_skeleton_new ()); + +@@ -1945,8 +1945,7 @@ export_remote_greeter_interface (GdmSession *self, + GDM_SESSION_DBUS_OBJECT_PATH, + NULL); + +- self->remote_greeter_interface = remote_greeter_interface; +- ++ g_set_object (&self->remote_greeter_interface, remote_greeter_interface); + } + + static gboolean +@@ -1966,7 +1965,7 @@ static void + export_chooser_interface (GdmSession *self, + GDBusConnection *connection) + { +- GdmDBusChooser *chooser_interface; ++ g_autoptr (GdmDBusChooser) chooser_interface = NULL; + + chooser_interface = GDM_DBUS_CHOOSER (gdm_dbus_chooser_skeleton_new ()); + +@@ -1980,7 +1979,7 @@ export_chooser_interface (GdmSession *self, + GDM_SESSION_DBUS_OBJECT_PATH, + NULL); + +- self->chooser_interface = chooser_interface; ++ g_set_object (&self->chooser_interface, chooser_interface); + } + + static void +-- +2.49.0 + diff --git a/SOURCES/0001-session-settings-Explicitly-cache-remote-users.patch b/SOURCES/0001-session-settings-Explicitly-cache-remote-users.patch new file mode 100644 index 0000000..b5da396 --- /dev/null +++ b/SOURCES/0001-session-settings-Explicitly-cache-remote-users.patch @@ -0,0 +1,45 @@ +From cf4664891ede9648d096569900e8b95abd91a633 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 7 Apr 2022 12:44:10 -0400 +Subject: [PATCH] session-settings: Explicitly cache remote users + +Right now a user's cache file won't get written out if they are logging +in with entirely default settings. + +This means remote users have to type in their usernames manually until +they change their session. + +This commit explicitly caches remote users. + +Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/743 +--- + daemon/gdm-session-settings.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c +index 5b64cb65b..ef5d72e7f 100644 +--- a/daemon/gdm-session-settings.c ++++ b/daemon/gdm-session-settings.c +@@ -406,6 +406,19 @@ gdm_session_settings_save (GdmSessionSettings *settings, + if (settings->priv->language_name != NULL) { + act_user_set_language (user, settings->priv->language_name); + } ++ ++ if (!act_user_is_local_account (user)) { ++ g_autoptr (GError) error = NULL; ++ ++ act_user_manager_cache_user (settings->priv->user_manager, username, &error); ++ ++ if (error != NULL) { ++ g_debug ("GdmSessionSettings: Could not locally cache remote user: %s", error->message); ++ g_object_unref (user); ++ return FALSE; ++ } ++ ++ } + g_object_unref (user); + + return TRUE; +-- +GitLab + 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 new file mode 100644 index 0000000..dad68eb --- /dev/null +++ b/SOURCES/0002-local-display-factory-Fix-user-switching-with-legacy.patch @@ -0,0 +1,174 @@ +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 + xorg + +legacy-xorg sessions currently fail to completely user switch. + +This is because the wrong session types are attached to the generated +login screen display. + +This commit refactors the code so the same session types are used for +user switching as are used for the initial login. +--- + daemon/gdm-local-display-factory.c | 103 ++++++++++++++++++++++------- + 1 file changed, 78 insertions(+), 25 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 7447b98..34842a7 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -358,6 +358,26 @@ store_display (GdmLocalDisplayFactory *factory, + gdm_display_store_add (store, display); + } + ++static GdmDisplay * ++create_legacy_xorg_display (GdmLocalDisplayFactory *factory) ++{ ++ guint32 display_number; ++ const char *session_types[] = { "x11", NULL }; ++ GdmDisplay *display; ++ ++ display_number = take_next_display_number (factory); ++ ++ g_debug ("GdmLocalDisplayFactory: Creating legacy Xorg display at :%d", display_number); ++ ++ display = gdm_legacy_display_new (display_number); ++ g_object_set (G_OBJECT (display), ++ "session-type", session_types[0], ++ "supported-session-types", session_types, ++ NULL); ++ ++ return display; ++} ++ + /* + Example: + dbus-send --system --dest=org.gnome.DisplayManager \ +@@ -407,15 +427,8 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact + is_initial = TRUE; + } + #endif +- if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) { +- if (display == NULL) { +- guint32 num; +- +- num = take_next_display_number (factory); +- +- display = gdm_legacy_display_new (num); +- } +- } ++ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) ++ display = create_legacy_xorg_display (factory); + + if (display == NULL) { + g_set_error_literal (error, +@@ -618,6 +631,24 @@ lookup_by_seat_id (const char *id, + return res; + } + ++static gboolean ++lookup_initial_display (const char *id, ++ GdmDisplay *display, ++ gpointer user_data) ++{ ++ gboolean is_initial = FALSE; ++ int status; ++ ++ status = gdm_display_get_status (display); ++ ++ if (status != GDM_DISPLAY_PREPARED && status != GDM_DISPLAY_MANAGED) ++ return FALSE; ++ ++ g_object_get (G_OBJECT (display), "is-initial", &is_initial, NULL); ++ ++ return is_initial; ++} ++ + static gboolean + lookup_prepared_display_by_seat_id (const char *id, + GdmDisplay *display, +@@ -633,6 +664,21 @@ lookup_prepared_display_by_seat_id (const char *id, + return lookup_by_seat_id (id, display, user_data); + } + ++static gboolean ++lookup_managed_display_by_seat_id (const char *id, ++ GdmDisplay *display, ++ gpointer user_data) ++{ ++ int status; ++ ++ status = gdm_display_get_status (display); ++ ++ if (status != GDM_DISPLAY_MANAGED) ++ return FALSE; ++ ++ return lookup_by_seat_id (id, display, user_data); ++} ++ + #ifdef HAVE_UDEV + static gboolean + udev_is_settled (GdmLocalDisplayFactory *factory) +@@ -740,6 +786,7 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, + int ret; + gboolean seat_supports_graphics; + gboolean is_seat0; ++ gboolean is_initial; + g_auto (GStrv) session_types = NULL; + const char *legacy_session_types[] = { "x11", NULL }; + GdmDisplayStore *store; +@@ -861,10 +908,25 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + +- if (is_seat0) +- display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id); +- else ++ 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; ++ } else { ++ display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id); ++ is_initial = TRUE; ++ } ++ } else { + display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id); ++ is_initial = FALSE; ++ } + + /* Ensure we don't create the same display more than once */ + if (display != NULL) { +@@ -905,20 +967,11 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, + } + #endif + +- if (display == NULL) { +- guint32 num; +- +- num = take_next_display_number (factory); +- +- display = gdm_legacy_display_new (num); +- g_object_set (G_OBJECT (display), +- "session-type", legacy_session_types[0], +- "supported-session-types", legacy_session_types, +- NULL); +- } ++ if (display == NULL) ++ display = create_legacy_xorg_display (factory); + + g_object_set (display, "seat-id", seat_id, NULL); +- g_object_set (display, "is-initial", is_seat0, NULL); ++ g_object_set (display, "is-initial", is_initial, NULL); + + store_display (factory, display); + diff --git a/SOURCES/0002-manager-Quit-plymouth-at-first-sign-of-failure.patch b/SOURCES/0002-manager-Quit-plymouth-at-first-sign-of-failure.patch new file mode 100644 index 0000000..ee8ceb8 --- /dev/null +++ b/SOURCES/0002-manager-Quit-plymouth-at-first-sign-of-failure.patch @@ -0,0 +1,102 @@ +From 27c78eb4efc598281eed9cd521ba1b05ee08e3d2 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 22 Jul 2024 14:59:43 -0400 +Subject: [PATCH 2/3] manager: Quit plymouth at first sign of failure + +Rather than quit plymouth after a replacement X server is already +started, this commit does it a bit earlier, so there is a battle +of display servers. +--- + common/gdm-address.c | 4 ++-- + daemon/gdm-manager.c | 5 +++++ + daemon/gdm-xdmcp-display-factory.c | 10 ++++++---- + 3 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/common/gdm-address.c b/common/gdm-address.c +index a8b73e2..3a507d0 100644 +--- a/common/gdm-address.c ++++ b/common/gdm-address.c +@@ -134,7 +134,7 @@ gdm_address_get_sockaddr_storage (GdmAddress *address) + g_return_val_if_fail (address != NULL, NULL); + g_return_val_if_fail (address->ss != NULL, NULL); + +- ss = g_memdup (address->ss, sizeof (struct sockaddr_storage)); ++ ss = g_memdup2 (address->ss, sizeof (struct sockaddr_storage)); + + return ss; + } +@@ -529,7 +529,7 @@ gdm_address_copy (GdmAddress *address) + g_return_val_if_fail (address != NULL, NULL); + + addr = g_new0 (GdmAddress, 1); +- addr->ss = g_memdup (address->ss, sizeof (struct sockaddr_storage)); ++ addr->ss = g_memdup2 (address->ss, sizeof (struct sockaddr_storage)); + + return addr; + } +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 7a68d52..23734e8 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -1545,6 +1545,8 @@ on_display_status_changed (GdmDisplay *display, + g_free (session_class); + } + break; ++ ++ case GDM_DISPLAY_FAILING: + case GDM_DISPLAY_FAILED: + case GDM_DISPLAY_UNMANAGED: + case GDM_DISPLAY_FINISHED: +@@ -1555,6 +1557,9 @@ on_display_status_changed (GdmDisplay *display, + } + #endif + ++ if (status == GDM_DISPLAY_FAILING) ++ break; ++ + g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL); + + if (display == manager->priv->automatic_login_display) { +diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c +index abb58fa..e82cfe1 100644 +--- a/daemon/gdm-xdmcp-display-factory.c ++++ b/daemon/gdm-xdmcp-display-factory.c +@@ -918,10 +918,10 @@ set_port_for_request (GdmAddress *address, + + switch (ss->ss_family) { + case AF_INET: +- port->data = (CARD8 *)g_memdup (&(SIN (ss)->sin_port), port->length); ++ port->data = (CARD8 *)g_memdup2 (&(SIN (ss)->sin_port), port->length); + break; + case AF_INET6: +- port->data = (CARD8 *)g_memdup (&(SIN6 (ss)->sin6_port), port->length); ++ port->data = (CARD8 *)g_memdup2 (&(SIN6 (ss)->sin6_port), port->length); + break; + default: + port->data = NULL; +@@ -940,11 +940,11 @@ set_address_for_request (GdmAddress *address, + switch (ss->ss_family) { + case AF_INET: + addr->length = sizeof (struct in_addr); +- addr->data = g_memdup (&SIN (ss)->sin_addr, addr->length); ++ addr->data = g_memdup2 (&SIN (ss)->sin_addr, addr->length); + break; + case AF_INET6: + addr->length = sizeof (struct in6_addr); +- addr->data = g_memdup (&SIN6 (ss)->sin6_addr, addr->length); ++ addr->data = g_memdup2 (&SIN6 (ss)->sin6_addr, addr->length); + break; + default: + addr->length = 0; +@@ -2090,6 +2090,8 @@ on_display_status_changed (GdmDisplay *display, + + gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory)); + break; ++ case GDM_DISPLAY_FAILING: ++ break; + case GDM_DISPLAY_FAILED: + gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory)); + break; +-- +2.44.0 + 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 new file mode 100644 index 0000000..a3896c4 --- /dev/null +++ b/SOURCES/0003-local-display-factory-Ensure-displays-are-properly-h.patch @@ -0,0 +1,105 @@ +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 + handled on status change + +1. There are some cases where a display will change its status from any + status to MANAGED and vice versa. Ensure that the display status handlers + dont' re do work that has already been done. +2. For legacy-xorg displays that reuse the display from login manager, + avoid those displays to be killed on successfull authentication. +--- + daemon/gdm-local-display-factory.c | 35 +++++++++++++++++++++--------- + daemon/gdm-manager.c | 4 +++- + 2 files changed, 28 insertions(+), 11 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index f28fe1e..61b7b45 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -600,6 +600,9 @@ on_display_status_changed (GdmDisplay *display, + break; + case GDM_DISPLAY_MANAGED: + #if defined(ENABLE_USER_DISPLAY_SERVER) ++ g_signal_handlers_disconnect_by_func (display, ++ G_CALLBACK (on_session_registered_cb), ++ factory); + g_signal_connect_object (display, + "notify::session-registered", + G_CALLBACK (on_session_registered_cb), +@@ -1183,6 +1186,18 @@ maybe_stop_greeter_in_background (GdmLocalDisplayFactory *factory, + g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_WAITING_TO_FINISH, NULL); + } + ++static void ++cancel_stop_greeter_in_background (GdmLocalDisplayFactory *factory, ++ GdmDisplay *display) ++{ ++ if (gdm_display_get_status (display) != GDM_DISPLAY_WAITING_TO_FINISH) ++ return; ++ ++ g_debug ("GdmLocalDisplayFactory: cancelling killing login window"); ++ ++ g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL); ++} ++ + static gboolean + on_vt_changed (GIOChannel *source, + GIOCondition condition, +@@ -1261,23 +1276,23 @@ on_vt_changed (GIOChannel *source, + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + /* if the old VT was running a wayland login screen kill it ++ * but cancel the killing if the user switched back to it + */ + if (gdm_get_login_window_session_id ("seat0", &login_session_id)) { + ret = sd_session_get_vt (login_session_id, &login_window_vt); + if (ret == 0 && login_window_vt != 0) { +- g_debug ("GdmLocalDisplayFactory: VT of login window is %u", login_window_vt); +- if (login_window_vt == previous_vt) { +- GdmDisplay *display; ++ GdmDisplay *display; + +- g_debug ("GdmLocalDisplayFactory: VT switched from login window"); ++ g_debug ("GdmLocalDisplayFactory: VT of login window is %u", login_window_vt); + +- display = gdm_display_store_find (store, +- lookup_by_session_id, +- (gpointer) login_session_id); +- if (display != NULL) ++ display = gdm_display_store_find (store, ++ lookup_by_session_id, ++ (gpointer) login_session_id); ++ if (display != NULL) { ++ if (login_window_vt == previous_vt) + maybe_stop_greeter_in_background (factory, display); +- } else { +- g_debug ("GdmLocalDisplayFactory: VT not switched from login window"); ++ else if (login_window_vt == factory->active_vt) ++ cancel_stop_greeter_in_background (factory, display); + } + } + } +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index e1bc62d..7a68d52 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -1534,11 +1534,13 @@ on_display_status_changed (GdmDisplay *display, + if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) || + (display_number != -1 && status == GDM_DISPLAY_MANAGED)) { + char *session_class; ++ gboolean session_registered = FALSE; + + g_object_get (display, + "session-class", &session_class, ++ "session-registered", &session_registered, + NULL); +- if (g_strcmp0 (session_class, "greeter") == 0) ++ if (g_strcmp0 (session_class, "greeter") == 0 && !session_registered) + set_up_session (manager, display); + g_free (session_class); + } +-- +2.49.0 + diff --git a/SOURCES/0003-manager-Quit-plymouth-synchronously.patch b/SOURCES/0003-manager-Quit-plymouth-synchronously.patch new file mode 100644 index 0000000..160e870 --- /dev/null +++ b/SOURCES/0003-manager-Quit-plymouth-synchronously.patch @@ -0,0 +1,94 @@ +From 190a9f31446ddab66c8b5c2e246a6253f85bde76 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 24 Jul 2024 08:40:08 -0400 +Subject: [PATCH 3/3] manager: Quit plymouth synchronously + +Plymouth needs to finish quitting before we start Xorg, so we can't +run it async. This command makes sure it gets run synchronously. +--- + daemon/gdm-manager.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 100b967fb..d4ad949fe 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -167,67 +167,72 @@ plymouth_prepare_for_transition (void) + + error = NULL; + res = g_spawn_command_line_sync ("plymouth deactivate", + NULL, NULL, NULL, &error); + if (! res) { + g_warning ("Could not deactivate plymouth: %s", error->message); + g_error_free (error); + } + } + + static gboolean + plymouth_quit_with_transition (void) + { + gboolean res; + GError *error; + + error = NULL; + res = g_spawn_command_line_async ("plymouth quit --retain-splash", &error); + if (! res) { + g_warning ("Could not quit plymouth: %s", error->message); + g_error_free (error); + } + + return G_SOURCE_REMOVE; + } + + static void + plymouth_quit_without_transition (void) + { + gboolean res; +- GError *error; ++ g_autoptr (GError) error = NULL; ++ g_autofree char *standard_error = NULL; ++ int wait_status = 0; + + error = NULL; +- res = g_spawn_command_line_async ("plymouth quit", &error); ++ res = g_spawn_command_line_sync ("plymouth quit", NULL, &standard_error, &wait_status, &error); + if (! res) { + g_warning ("Could not quit plymouth: %s", error->message); +- g_error_free (error); ++ } else if (!WIFEXITED (wait_status) || WEXITSTATUS (wait_status) != 0) { ++ g_warning ("plymouth errored on quit command%s%s", ++ standard_error? ":" : "", ++ standard_error?: ""); + } + } + #endif + + static char * + get_session_id_for_pid (pid_t pid, + GError **error) + { + char *session, *gsession; + int ret; + + session = NULL; + ret = sd_pid_get_session (pid, &session); + if (ret < 0) { + g_set_error (error, + GDM_DISPLAY_ERROR, + GDM_DISPLAY_ERROR_GETTING_SESSION_INFO, + "Error getting session id from systemd: %s", + g_strerror (-ret)); + return NULL; + } + + if (session != NULL) { + gsession = g_strdup (session); + free (session); + + return gsession; + } else { + return NULL; + } +-- +2.44.0 + 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 new file mode 100644 index 0000000..6c226a5 --- /dev/null +++ b/SOURCES/0004-local-display-factory-Return-a-session-type-on-legac.patch @@ -0,0 +1,54 @@ +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 + legacy-xorg + +On legacy-xorg, there's graphic support through Xorg. + +When returning none, it's considered that seat doesn't support graphics +and has to wait a 10s timeout, then forces using Xorg. + +Avoid that timeout directly returning x11 as session type for +legacy-xorg. +--- + daemon/gdm-local-display-factory.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 34842a7..f28fe1e 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -303,6 +303,7 @@ gdm_local_display_factory_get_session_types (GdmLocalDisplayFactory *factory, + const char *fallback_display_server = NULL; + gboolean wayland_preferred = FALSE; + gboolean xorg_preferred = FALSE; ++ gboolean legacy_xorg_preferred = FALSE; + g_autoptr (GPtrArray) session_types_array = NULL; + char **session_types; + +@@ -315,13 +316,18 @@ gdm_local_display_factory_get_session_types (GdmLocalDisplayFactory *factory, + + wayland_preferred = g_str_equal (preferred_display_server, "wayland"); + xorg_preferred = g_str_equal (preferred_display_server, "xorg"); ++ legacy_xorg_preferred = g_str_equal (preferred_display_server, "legacy-xorg"); + +- if (wayland_preferred) ++ if (wayland_preferred) { + fallback_display_server = "xorg"; +- else if (xorg_preferred) ++ } else if (xorg_preferred) { + fallback_display_server = "wayland"; +- else ++ } else if (legacy_xorg_preferred) { ++ g_ptr_array_add (session_types_array, (gpointer) "x11"); ++ return g_strdupv ((char **) session_types_array->pdata); ++ } else { + return NULL; ++ } + + if (!should_fall_back) { + if (display_server_enabled (factory, preferred_display_server)) +-- +2.49.0 + diff --git a/SOURCES/gdm.sysusers b/SOURCES/gdm.sysusers new file mode 100644 index 0000000..66130aa --- /dev/null +++ b/SOURCES/gdm.sysusers @@ -0,0 +1 @@ +u gdm 42 "GNOME Display Manager" /var/lib/gdm \ No newline at end of file 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 30a8d20..7e27dce 100644 --- a/SPECS/gdm.spec +++ b/SPECS/gdm.spec @@ -11,7 +11,7 @@ Name: gdm Epoch: 1 Version: 40.1 -Release: 23%{?dist} +Release: 30.0.1%{?dist} Summary: The GNOME Display Manager License: GPLv2+ @@ -23,6 +23,8 @@ Source2: gdm-tmpfiles.conf # moved here from pulseaudio-gdm-hooks-11.1-16 Source5: default.pa-for-gdm +Source6: gdm.sysusers + # Upstream backports Patch10001: 0001-local-display-factory-Provide-more-flexibility-for-c.patch @@ -43,7 +45,7 @@ Patch60001: 0001-session-settings-Fetch-session-from-user-even-if-use.patch Patch70001: 0001-manager-Fix-btmp-record-accounting.patch -Patch80001: 0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch +Patch80002: 0001-session-settings-Explicitly-cache-remote-users.patch # Latest udev rules and support code Patch90001: 0001-local-display-factory-Stall-startup-until-main-graph.patch @@ -51,6 +53,17 @@ Patch90002: 0002-common-Add-API-to-reload-settings-from-disk.patch Patch90003: 0003-common-Reload-settings-when-graphics-initialize.patch Patch90004: 0004-data-Use-latest-upstream-udev-rules.patch +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 + +Patch110001: 0001-display-Add-new-FAILING-state.patch +Patch110002: 0002-manager-Quit-plymouth-at-first-sign-of-failure.patch +Patch110003: 0003-manager-Quit-plymouth-synchronously.patch + +Patch120001: 0001-session-Fix-memory-leak-on-new-outside-connection.patch + # Non-upstreamable workarounds Patch66610001: 0001-data-reap-gdm-sessions-on-shutdown.patch @@ -66,6 +79,8 @@ Patch99930001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch Patch99950001: 0001-data-Disable-network-configuration-on-login-screen.patch +#Oracle patches +Patch1000000: orabug34816116-Disable-Wayland-on-Matrox-chipsets.patch BuildRequires: accountsservice-devel BuildRequires: audit-libs-devel >= %{libauditver} @@ -97,13 +112,13 @@ BuildRequires: pkgconfig(xorg-server) BuildRequires: plymouth-devel BuildRequires: systemd BuildRequires: systemd-devel +BuildRequires: systemd-rpm-macros BuildRequires: which BuildRequires: xorg-x11-server-Xorg BuildRequires: xorg-x11-server-devel BuildRequires: yelp-devel BuildRequires: yelp-tools -Requires(pre): /usr/sbin/useradd %{?systemd_requires} Provides: service(graphical-login) = %{name} @@ -132,6 +147,8 @@ Requires: xorg-x11-xinit # use a user bus Requires: /usr/bin/dbus-run-session +%{?sysusers_requires_compat} + Requires(posttrans): dconf Provides: gdm-libs%{?_isa} = %{epoch}:%{version}-%{release} @@ -188,6 +205,8 @@ mkdir -p %{buildroot}%{_sysconfdir}/gdm/PostSession install -p -m644 -D %{SOURCE2} %{buildroot}%{_tmpfilesdir}/%{name}.conf install -p -m644 -D %{SOURCE5} %{buildroot}%{_localstatedir}/lib/gdm/.config/pulse/default.pa +install -p -m644 -D %{SOURCE6} %{buildroot}%{_sysusersdir}/%{name}.conf + rm -f %{buildroot}%{_sysconfdir}/pam.d/gdm @@ -211,11 +230,8 @@ mkdir -p %{buildroot}%{_sysconfdir}/dconf/db/gdm.d/locks %find_lang gdm --with-gnome %pre -/usr/sbin/useradd -M -u 42 -d /var/lib/gdm -s /sbin/nologin -r gdm > /dev/null 2>&1 -/usr/sbin/usermod -d /var/lib/gdm -s /sbin/nologin gdm >/dev/null 2>&1 -# ignore errors, as we can't disambiguate between gdm already existed -# and couldn't create account with the current adduser. -exit 0 +%sysusers_create_compat %{SOURCE6} + %post # if the user already has a config file, then migrate it to the new @@ -339,6 +355,7 @@ dconf update || : %dir %{_userunitdir}/gnome-session@gnome-login.target.d/ %{_userunitdir}/gnome-session@gnome-login.target.d/session.conf %{_tmpfilesdir}/%{name}.conf +%{_sysusersdir}/%{name}.conf %files devel %dir %{_includedir}/gdm @@ -353,6 +370,42 @@ dconf update || : %{_libdir}/pkgconfig/gdm-pam-extensions.pc %changelog +* Tue Aug 05 2025 EL Errata - 40.1-30.0.1 +- Disable Wayland on Matrox [Orabug: 34816116] + +* Fri Jun 20 2025 Joan Torres - 40.1-30 +- Fix leak on new connections + Resolves: RHEL-98725 + +* Thu Jun 12 2025 Joan Torres - 40.1-29 +- Fix legacy-xorg session switching + The fix that intended to fix the issue wasn't complete and also, + introduced a bug on user switching for non legacy-xorg servers. + This fix addresses both issues. +- Avoid waiting 10s when starting GDM in legacy-xorg mode + Resolves: RHEL-97492 + +* Fri Mar 07 2025 Tomas Pelka - 40.1-28 +- Use systemd sysusers config to create user and group + Resolves: RHEL-78738 + +* Wed Jul 24 2024 Ray Strode - 40.1-27 +- More fixes with wayland->xorg fallback + Related: RHEL-35045 + Resolves: RHEL-50393 + +* Tue Jul 23 2024 Ray Strode - 40.1-26 +- Fix failure doing wayland->xorg fallback + Related: RHEL-35045 + +* Wed May 01 2024 Ray Strode - 40.1-25 +- Fix user switching with PreferredDisplayServer=legacy-xorg + Related: RHEL-29845 + +* Tue Jan 16 2024 Andrew Lukoshko - 40.1-24 +- Explicitly cache remote users + Resolves: RHEL-21791 + * Fri Dec 15 2023 Ray Strode - 40.1-23 - Make /var/log/gdm tmpfiles.d snippet match files manifest to fix installability test