Blame SOURCES/0003-manager-don-t-bail-if-session-disappears-out-from-un.patch

795d2c
From 64779fcad9efa9fdb4b1a8963e2386cf763e53d8 Mon Sep 17 00:00:00 2001
795d2c
From: Ray Strode <rstrode@redhat.com>
795d2c
Date: Fri, 22 Jun 2018 15:26:03 -0400
795d2c
Subject: [PATCH 3/6] manager: don't bail if session disappears out from under
795d2c
 us
795d2c
795d2c
It's entirely possible for a session returned by
795d2c
sd_seat_get_sessions to disappear immediately after the
795d2c
sd_seat_get_sessions call returns.  This is especially
795d2c
likely at logout time where the session will briefly be
795d2c
in the "closing" state before getting reaped.
795d2c
795d2c
If that happens when we're looking for a greeter session, we
795d2c
stop looking for a greeter session and bail out all confused.
795d2c
795d2c
This commit fixes the confusion by gracefully handling the
795d2c
session disappearing by just proceeding to the next session
795d2c
in the list.
795d2c
---
795d2c
 daemon/gdm-manager.c | 9 +++++++++
795d2c
 1 file changed, 9 insertions(+)
795d2c
795d2c
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
795d2c
index 3f5772e65..c391307fa 100644
795d2c
--- a/daemon/gdm-manager.c
795d2c
+++ b/daemon/gdm-manager.c
795d2c
@@ -1318,87 +1318,96 @@ maybe_start_pending_initial_login (GdmManager *manager,
795d2c
         g_free (user_session_seat_id);
795d2c
 }
795d2c
 
795d2c
 static gboolean
795d2c
 get_login_window_session_id (const char  *seat_id,
795d2c
                              char       **session_id)
795d2c
 {
795d2c
         gboolean   ret;
795d2c
         int        res, i;
795d2c
         char     **sessions;
795d2c
         char      *service_id;
795d2c
         char      *service_class;
795d2c
         char      *state;
795d2c
 
795d2c
         res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
795d2c
         if (res < 0) {
795d2c
                 g_debug ("Failed to determine sessions: %s", strerror (-res));
795d2c
                 return FALSE;
795d2c
         }
795d2c
 
795d2c
         if (sessions == NULL || sessions[0] == NULL) {
795d2c
                 *session_id = NULL;
795d2c
                 ret = TRUE;
795d2c
                 goto out;
795d2c
         }
795d2c
 
795d2c
         for (i = 0; sessions[i]; i ++) {
795d2c
 
795d2c
                 res = sd_session_get_class (sessions[i], &service_class);
795d2c
                 if (res < 0) {
795d2c
+                        if (res == -ENOENT || res == -ENXIO) {
795d2c
+                                continue;
795d2c
+                        }
795d2c
+
795d2c
                         g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
795d2c
                         ret = FALSE;
795d2c
                         goto out;
795d2c
                 }
795d2c
 
795d2c
                 if (strcmp (service_class, "greeter") != 0) {
795d2c
                         free (service_class);
795d2c
                         continue;
795d2c
                 }
795d2c
 
795d2c
                 free (service_class);
795d2c
 
795d2c
                 ret = sd_session_get_state (sessions[i], &state);
795d2c
                 if (ret < 0) {
795d2c
+                        if (res == -ENOENT || res == -ENXIO)
795d2c
+                                continue;
795d2c
+
795d2c
                         g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
795d2c
                         ret = FALSE;
795d2c
                         goto out;
795d2c
                 }
795d2c
 
795d2c
                 if (g_strcmp0 (state, "closing") == 0) {
795d2c
                         free (state);
795d2c
                         continue;
795d2c
                 }
795d2c
                 free (state);
795d2c
 
795d2c
                 res = sd_session_get_service (sessions[i], &service_id);
795d2c
                 if (res < 0) {
795d2c
+                        if (res == -ENOENT || res == -ENXIO)
795d2c
+                                continue;
795d2c
                         g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
795d2c
                         ret = FALSE;
795d2c
                         goto out;
795d2c
                 }
795d2c
 
795d2c
                 if (strcmp (service_id, "gdm-launch-environment") == 0) {
795d2c
                         *session_id = g_strdup (sessions[i]);
795d2c
                         ret = TRUE;
795d2c
 
795d2c
                         free (service_id);
795d2c
                         goto out;
795d2c
                 }
795d2c
 
795d2c
                 free (service_id);
795d2c
         }
795d2c
 
795d2c
         *session_id = NULL;
795d2c
         ret = TRUE;
795d2c
 
795d2c
 out:
795d2c
         if (sessions) {
795d2c
                 for (i = 0; sessions[i]; i ++) {
795d2c
                         free (sessions[i]);
795d2c
                 }
795d2c
 
795d2c
                 free (sessions);
795d2c
         }
795d2c
 
795d2c
         return ret;
795d2c
 }
795d2c
-- 
795d2c
2.19.0
795d2c