Blob Blame History Raw
From 0317fe746acc1f14bcb64d740de813f9ca8f4e70 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 23 Aug 2017 09:26:11 -0400
Subject: [PATCH] manager: fix dangling pointer free

When reauthenticating, we can crash if no login screen
is running on the seat (for instance, when building
with --disable-user-display-server, and not user
switching).  The crash is due to a dangling
pointer.

This commit fixes that.

https://bugzilla.gnome.org/show_bug.cgi?id=786656
---
 daemon/gdm-manager.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 3eef745f..f001a36e 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -2003,62 +2003,62 @@ on_user_session_died (GdmSession *session,
 static char *
 get_display_device (GdmManager *manager,
                     GdmDisplay *display)
 {
         /* systemd finds the display device out on its own based on the display */
         return NULL;
 }
 
 static void
 on_session_reauthenticated (GdmSession *session,
                             const char *service_name,
                             GdmManager *manager)
 {
         gboolean fail_if_already_switched = FALSE;
 
         if (gdm_session_get_display_mode (session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) {
                 const char *seat_id;
                 char *session_id;
 
                 seat_id = gdm_session_get_display_seat_id (session);
                 if (get_login_window_session_id (seat_id, &session_id)) {
                         GdmDisplay *display = gdm_display_store_find (manager->priv->display_store,
                                                                       lookup_by_session_id,
                                                                       (gpointer) session_id);
 
                         if (display != NULL) {
                                 gdm_display_stop_greeter_session (display);
                                 gdm_display_unmanage (display);
                                 gdm_display_finish (display);
                         }
+                        g_free (session_id);
                 }
-                g_free (session_id);
         }
 
         /* There should already be a session running, so jump to its
          * VT. In the event we're already on the right VT, (i.e. user
          * used an unlock screen instead of a user switched login screen),
          * then silently succeed and unlock the session.
          */
         switch_to_compatible_user_session (manager, session, fail_if_already_switched);
 }
 
 static void
 on_session_client_ready_for_session_to_start (GdmSession      *session,
                                               const char      *service_name,
                                               gboolean         client_is_ready,
                                               GdmManager      *manager)
 {
         gboolean waiting_to_start_user_session;
 
         if (client_is_ready) {
                 g_debug ("GdmManager: Will start session when ready");
         } else {
                 g_debug ("GdmManager: Will start session when ready and told");
         }
 
         waiting_to_start_user_session = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session),
                                                                        "waiting-to-start"));
 
         g_object_set_data (G_OBJECT (session),
                            "start-when-ready",
                            GINT_TO_POINTER (client_is_ready));
-- 
2.14.3