[gdm/rhel-7.9: 17/51] local-display-factory: don't spawn login screen if background session dies
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/rhel-7.9: 17/51] local-display-factory: don't spawn login screen if background session dies
- Date: Mon, 12 Apr 2021 20:58:09 +0000 (UTC)
commit b29a04d0ad5ded842d53b3c54bd3160b7f33d926
Author: Ray Strode <rstrode redhat com>
Date: Wed May 22 10:53:12 2019 -0400
local-display-factory: don't spawn login screen if background session dies
At the moment gdm conjures up a login screen any time a user session
exits.
This is the right behavior if the user explicitly logs out, but if an
admin is killing a session on a background VT, then going to the login
screen is wrong.
This commit changes the code to detect when the killed session is in
the foreground, and only then bring up a login screen.
daemon/gdm-local-display-factory.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
---
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index cf4f5095c..6856d30d0 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -254,10 +254,12 @@ on_display_status_changed (GdmDisplay *display,
GdmDisplayStore *store;
int num;
char *seat_id = NULL;
+ char *session_id = NULL;
char *session_type = NULL;
char *session_class = NULL;
gboolean is_initial = TRUE;
gboolean is_local = TRUE;
+ int ret;
num = -1;
gdm_display_get_x11_display_number (display, &num, NULL);
@@ -266,6 +268,7 @@ on_display_status_changed (GdmDisplay *display,
g_object_get (display,
"seat-id", &seat_id,
+ "session-id", &session_id,
"is-initial", &is_initial,
"is-local", &is_local,
"session-type", &session_type,
@@ -288,10 +291,28 @@ on_display_status_changed (GdmDisplay *display,
* a new login screen comes up if one is missing.
*/
if (is_local && g_strcmp0 (session_class, "greeter") != 0) {
+ g_autofree char *active_session = NULL;
+
/* reset num failures */
factory->priv->num_failures = 0;
- create_display (factory, seat_id, session_type, is_initial);
+ ret = sd_seat_get_active (seat_id, &active_session, NULL);
+
+ if (ret == 0) {
+ g_autofree char *state = NULL;
+ ret = sd_session_get_state (active_session, &state);
+ if (ret != 0 ||
+ g_strcmp0 (state, "closing") == 0 ||
+ g_strcmp0 (active_session, session_id) == 0) {
+ g_clear_pointer (&active_session, free);
+ }
+ }
+
+ /* If this died in the foreground leaving us on a blank vt,
+ start a new login screen */
+ if (!sd_seat_can_multi_session (seat_id) || active_session == NULL) {
+ create_display (factory, seat_id, session_type, is_initial);
+ }
}
break;
case GDM_DISPLAY_FAILED:
@@ -331,6 +352,7 @@ on_display_status_changed (GdmDisplay *display,
}
g_free (seat_id);
+ g_free (session_id);
g_free (session_type);
g_free (session_class);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]