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

18ca79
From cbfb3ef99ecc9cbb4e6850e5dd0cc9fb65dd398a Mon Sep 17 00:00:00 2001
e0b6b0
From: Ray Strode <rstrode@redhat.com>
e0b6b0
Date: Tue, 1 Sep 2020 13:49:27 -0400
18ca79
Subject: [PATCH 1/3] 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
ffa191
index 7c954ad24..3a260923a 100644
e0b6b0
--- a/daemon/gdm-display.c
e0b6b0
+++ b/daemon/gdm-display.c
ffa191
@@ -648,62 +648,60 @@ gdm_display_disconnect (GdmDisplay *self)
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)
ffa191
                         xcb_kill_client (priv->xcb_connection, client);
e0b6b0
         }
e0b6b0
 
ffa191
         xcb_flush (priv->xcb_connection);
e0b6b0
 
ffa191
         g_clear_pointer (&priv->xcb_connection, xcb_disconnect);
e0b6b0
 }
e0b6b0
 
e0b6b0
 gboolean
e0b6b0
 gdm_display_unmanage (GdmDisplay *self)
e0b6b0
 {
ffa191
         GdmDisplayPrivate *priv;
ffa191
 
e0b6b0
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
e0b6b0
 
ffa191
         priv = gdm_display_get_instance_private (self);
ffa191
 
e0b6b0
-        g_debug ("GdmDisplay: unmanage display");
e0b6b0
-
e0b6b0
         gdm_display_disconnect (self);
e0b6b0
 
ffa191
         if (priv->user_access_file != NULL) {
ffa191
                 gdm_display_access_file_close (priv->user_access_file);
ffa191
                 g_object_unref (priv->user_access_file);
ffa191
                 priv->user_access_file = NULL;
e0b6b0
         }
e0b6b0
 
ffa191
         if (priv->access_file != NULL) {
ffa191
                 gdm_display_access_file_close (priv->access_file);
ffa191
                 g_object_unref (priv->access_file);
ffa191
                 priv->access_file = NULL;
e0b6b0
         }
e0b6b0
 
ffa191
         if (!priv->session_registered) {
e0b6b0
                 g_warning ("GdmDisplay: Session never registered, failing");
e0b6b0
                 _gdm_display_set_status (self, GDM_DISPLAY_FAILED);
e0b6b0
         } else {
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
 {
ffa191
         GdmDisplayPrivate *priv;
ffa191
@@ -1446,63 +1444,63 @@ gdm_display_get_object_skeleton (GdmDisplay *self)
e0b6b0
 {
ffa191
         GdmDisplayPrivate *priv;
e0b6b0
 
ffa191
         priv = gdm_display_get_instance_private (self);
ffa191
         return 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
-        }
ffa191
+
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
-- 
ffa191
2.31.1
e0b6b0