import OL gdm-40.1-30.0.1.el9_6

This commit is contained in:
Andrew Lukoshko 2025-08-07 10:54:18 +00:00
parent 24b6972d31
commit 425fca4ce4
13 changed files with 835 additions and 17 deletions

View File

@ -0,0 +1,57 @@
From f7295f73f424e22eacb940c92e43326d75c901e1 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -1,7 +1,7 @@
From bcab8852cf7249a2220f6c737f7bb8a17b99249a Mon Sep 17 00:00:00 2001
From: rpm-build <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.

View File

@ -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 <rstrode@redhat.com>
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

View File

@ -0,0 +1,96 @@
From 3d67dc8e992b69c331b403b5ff7f680700392977 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Torres=20L=C3=B3pez?= <joantolo@redhat.com>
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

View File

@ -0,0 +1,45 @@
From cf4664891ede9648d096569900e8b95abd91a633 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -0,0 +1,174 @@
From 510566699c480226b189215c6222f7e72979baf8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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);

View File

@ -0,0 +1,102 @@
From 27c78eb4efc598281eed9cd521ba1b05ee08e3d2 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -0,0 +1,105 @@
From de73b654cd1b726b905a9bf3238c7eaabfe465d5 Mon Sep 17 00:00:00 2001
From: Joan Torres <joantolo@redhat.com>
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

View File

@ -0,0 +1,94 @@
From 190a9f31446ddab66c8b5c2e246a6253f85bde76 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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

View File

@ -0,0 +1,54 @@
From 8bcb9f43c203ab4818381cd707128eac74ab958d Mon Sep 17 00:00:00 2001
From: Joan Torres <joantolo@redhat.com>
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

1
SOURCES/gdm.sysusers Normal file
View File

@ -0,0 +1 @@
u gdm 42 "GNOME Display Manager" /var/lib/gdm

View File

@ -0,0 +1,37 @@
From 37c6a13fd6b605206120f99bc145d1a65a1404d1 Mon Sep 17 00:00:00 2001
From: rpm-build <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 <alexander.burmashev@oracle.com>
Signed-off-by: Darren Archibald <darren.archibald@oracle.com>
---
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

View File

@ -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 <el-errata_ww@oracle.com> - 40.1-30.0.1
- Disable Wayland on Matrox [Orabug: 34816116]
* Fri Jun 20 2025 Joan Torres <joantolo@redhat.com> - 40.1-30
- Fix leak on new connections
Resolves: RHEL-98725
* Thu Jun 12 2025 Joan Torres <joantolo@redhat.com> - 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 <rstrode@redhat.com> - 40.1-27
- More fixes with wayland->xorg fallback
Related: RHEL-35045
Resolves: RHEL-50393
* Tue Jul 23 2024 Ray Strode <rstrode@redhat.com> - 40.1-26
- Fix failure doing wayland->xorg fallback
Related: RHEL-35045
* Wed May 01 2024 Ray Strode <rstrode@redhat.com> - 40.1-25
- Fix user switching with PreferredDisplayServer=legacy-xorg
Related: RHEL-29845
* Tue Jan 16 2024 Andrew Lukoshko <alukoshko@almalinux.org> - 40.1-24
- Explicitly cache remote users
Resolves: RHEL-21791
* Fri Dec 15 2023 Ray Strode <rstrode@redhat.com> - 40.1-23
- Make /var/log/gdm tmpfiles.d snippet match files manifest
to fix installability test