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

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