Blame SOURCES/0001-display-Handle-failure-before-display-registration.patch

3b7e70
From cbfb3ef99ecc9cbb4e6850e5dd0cc9fb65dd398a Mon Sep 17 00:00:00 2001
400dab
From: Ray Strode <rstrode@redhat.com>
400dab
Date: Tue, 1 Sep 2020 13:49:27 -0400
3b7e70
Subject: [PATCH 1/3] display: Handle failure before display registration
400dab
400dab
Normally, e.g., gdm-wayland-session would register its display
400dab
before starting the session.  This display registration is how
400dab
the display moves to the "managed" state.  We currently detect
400dab
session failure in gdm_display_unmanage. If gdm-wayland-session
400dab
is killed before it registers the display, gdm_display_unmanage
400dab
won't run, and failure won't be detected.
400dab
400dab
This commit make gdm_display_unmanage get called, even if the
400dab
display isn't yet fully managed.
400dab
---
400dab
 daemon/gdm-display.c | 8 +++-----
400dab
 1 file changed, 3 insertions(+), 5 deletions(-)
400dab
400dab
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
3b7e70
index 7c954ad24..3a260923a 100644
400dab
--- a/daemon/gdm-display.c
400dab
+++ b/daemon/gdm-display.c
3b7e70
@@ -648,62 +648,60 @@ gdm_display_disconnect (GdmDisplay *self)
400dab
 
400dab
         /* resource_id_mask is the bits given to each client for
400dab
          * addressing resources */
400dab
         highest_client = (XID) ~unused_bits & ~setup->resource_id_mask;
400dab
         client_increment = setup->resource_id_mask + 1;
400dab
 
400dab
         /* Kill every client but ourselves, then close our own connection
400dab
          */
400dab
         for (client = 0;
400dab
              client <= highest_client;
400dab
              client += client_increment) {
400dab
 
400dab
                 if (client != setup->resource_id_base)
3b7e70
                         xcb_kill_client (priv->xcb_connection, client);
400dab
         }
400dab
 
3b7e70
         xcb_flush (priv->xcb_connection);
400dab
 
3b7e70
         g_clear_pointer (&priv->xcb_connection, xcb_disconnect);
400dab
 }
400dab
 
400dab
 gboolean
400dab
 gdm_display_unmanage (GdmDisplay *self)
400dab
 {
3b7e70
         GdmDisplayPrivate *priv;
3b7e70
 
400dab
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
400dab
 
3b7e70
         priv = gdm_display_get_instance_private (self);
3b7e70
 
400dab
-        g_debug ("GdmDisplay: unmanage display");
400dab
-
400dab
         gdm_display_disconnect (self);
400dab
 
3b7e70
         if (priv->user_access_file != NULL) {
3b7e70
                 gdm_display_access_file_close (priv->user_access_file);
3b7e70
                 g_object_unref (priv->user_access_file);
3b7e70
                 priv->user_access_file = NULL;
400dab
         }
400dab
 
3b7e70
         if (priv->access_file != NULL) {
3b7e70
                 gdm_display_access_file_close (priv->access_file);
3b7e70
                 g_object_unref (priv->access_file);
3b7e70
                 priv->access_file = NULL;
400dab
         }
400dab
 
3b7e70
         if (!priv->session_registered) {
400dab
                 g_warning ("GdmDisplay: Session never registered, failing");
400dab
                 _gdm_display_set_status (self, GDM_DISPLAY_FAILED);
400dab
         } else {
400dab
                 _gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED);
400dab
         }
400dab
 
400dab
         return TRUE;
400dab
 }
400dab
 
400dab
 gboolean
400dab
 gdm_display_get_id (GdmDisplay         *self,
400dab
                     char              **id,
400dab
                     GError            **error)
400dab
 {
3b7e70
         GdmDisplayPrivate *priv;
3b7e70
@@ -1446,63 +1444,63 @@ gdm_display_get_object_skeleton (GdmDisplay *self)
400dab
 {
3b7e70
         GdmDisplayPrivate *priv;
400dab
 
3b7e70
         priv = gdm_display_get_instance_private (self);
3b7e70
         return priv->object_skeleton;
400dab
 }
400dab
 
400dab
 static void
400dab
 on_launch_environment_session_opened (GdmLaunchEnvironment *launch_environment,
400dab
                                       GdmDisplay           *self)
400dab
 {
400dab
         char       *session_id;
400dab
 
400dab
         g_debug ("GdmDisplay: Greeter session opened");
400dab
         session_id = gdm_launch_environment_get_session_id (launch_environment);
400dab
         _gdm_display_set_session_id (self, session_id);
400dab
         g_free (session_id);
400dab
 }
400dab
 
400dab
 static void
400dab
 on_launch_environment_session_started (GdmLaunchEnvironment *launch_environment,
400dab
                                        GdmDisplay           *self)
400dab
 {
400dab
         g_debug ("GdmDisplay: Greeter started");
400dab
 }
400dab
 
400dab
 static void
400dab
 self_destruct (GdmDisplay *self)
400dab
 {
400dab
         g_object_ref (self);
400dab
-        if (gdm_display_get_status (self) == GDM_DISPLAY_MANAGED) {
400dab
-                gdm_display_unmanage (self);
400dab
-        }
3b7e70
+
400dab
+        g_debug ("GdmDisplay: initiating display self-destruct");
400dab
+        gdm_display_unmanage (self);
400dab
 
400dab
         if (gdm_display_get_status (self) != GDM_DISPLAY_FINISHED) {
400dab
                 queue_finish (self);
400dab
         }
400dab
         g_object_unref (self);
400dab
 }
400dab
 
400dab
 static void
400dab
 on_launch_environment_session_stopped (GdmLaunchEnvironment *launch_environment,
400dab
                                        GdmDisplay           *self)
400dab
 {
400dab
         g_debug ("GdmDisplay: Greeter stopped");
400dab
         self_destruct (self);
400dab
 }
400dab
 
400dab
 static void
400dab
 on_launch_environment_session_exited (GdmLaunchEnvironment *launch_environment,
400dab
                                       int                   code,
400dab
                                       GdmDisplay           *self)
400dab
 {
400dab
         g_debug ("GdmDisplay: Greeter exited: %d", code);
400dab
         self_destruct (self);
400dab
 }
400dab
 
400dab
 static void
400dab
 on_launch_environment_session_died (GdmLaunchEnvironment *launch_environment,
400dab
                                     int                   signal,
400dab
                                     GdmDisplay           *self)
400dab
 {
400dab
         g_debug ("GdmDisplay: Greeter died: %d", signal);
400dab
-- 
3b7e70
2.31.1
400dab