[gdm] session: don't close outside connections during session reset



commit cc2e40149add72f59bb9cff184cd7ab525d53522
Author: Ray Strode <rstrode redhat com>
Date:   Mon Jul 1 07:57:07 2013 -0400

    session: don't close outside connections during session reset
    
    If a user clicks cancel in the login screen the underlying
    user verification session gets reset, which causes the greeter
    connection to get scrubbed from the record.
    
    Resetting is correct, but scrubbing the connection isn't.
    
    The bug manifests itself at login time, by the greeter not fading
    out if the user hit cancel once before logging in.  Instead, the
    greeter gets kill right away and login proceeds abruptly.
    
    This commit makes gdm_session_reset not erreoneously do this connection
    scrubbing.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=703386

 daemon/gdm-session.c |   27 ++++++++++++++++-----------
 1 files changed, 16 insertions(+), 11 deletions(-)
---
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 816a4b4..9f79460 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -2487,14 +2487,9 @@ stop_all_conversations (GdmSession *self)
         stop_all_other_conversations (self, NULL, TRUE);
 }
 
-void
-gdm_session_close (GdmSession *self)
+static void
+do_reset (GdmSession *self)
 {
-
-        g_return_if_fail (GDM_IS_SESSION (self));
-
-        g_debug ("GdmSession: Closing session");
-
         if (self->priv->session_conversation != NULL) {
                 gdm_session_record_logout (self->priv->session_pid,
                                            self->priv->selected_user,
@@ -2505,9 +2500,6 @@ gdm_session_close (GdmSession *self)
 
         stop_all_conversations (self);
 
-        g_list_free_full (self->priv->outside_connections, g_object_unref);
-        self->priv->outside_connections = NULL;
-
         g_list_free_full (self->priv->pending_worker_connections, g_object_unref);
         self->priv->pending_worker_connections = NULL;
 
@@ -2536,6 +2528,19 @@ gdm_session_close (GdmSession *self)
 }
 
 void
+gdm_session_close (GdmSession *self)
+{
+
+        g_return_if_fail (GDM_IS_SESSION (self));
+
+        g_debug ("GdmSession: Closing session");
+        do_reset (self);
+
+        g_list_free_full (self->priv->outside_connections, g_object_unref);
+        self->priv->outside_connections = NULL;
+}
+
+void
 gdm_session_answer_query (GdmSession *self,
                           const char *service_name,
                           const char *text)
@@ -2566,7 +2571,7 @@ gdm_session_reset (GdmSession *self)
                 gdm_dbus_user_verifier_emit_reset (self->priv->user_verifier_interface);
         }
 
-        gdm_session_close (self);
+        do_reset (self);
 }
 
 void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]