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