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

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