From c1c3fec98b406f8783dfa9bfe246f4638e8d650a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Jan 23 2015 19:31:33 +0000 Subject: Another user switching fix Related: #1184933 --- diff --git a/fix-user-switching.patch b/fix-user-switching.patch index a316d4b..d8de2c9 100644 --- a/fix-user-switching.patch +++ b/fix-user-switching.patch @@ -118,3 +118,157 @@ index 8c41045..0278512 100644 -- 2.2.1 +From 259ef2d7d7acc4e7bb0602eea835b9585997413b Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 23 Jan 2015 14:25:05 -0500 +Subject: [PATCH] manager: clean seed session when its display goes away + +If the display goes away right before the session exits, then we +can crash because we'll try to finish the already finished display. + +This commit corrects the problem by making sure to dissociate the +display from the seed session when the display is finished. + +https://bugzilla.gnome.org/show_bug.cgi?id=719418 +--- + daemon/gdm-manager.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 0278512..684e462 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -1820,60 +1820,67 @@ start_autologin_conversation_if_necessary (GdmManager *manager, + if (delay == 0 && g_file_test (GDM_RAN_ONCE_MARKER_FILE, G_FILE_TEST_EXISTS)) { + return; + } + + if (!enabled) { + return; + } + + g_debug ("GdmManager: Starting automatic login conversation"); + gdm_session_start_conversation (session, "gdm-autologin"); + } + + static void + touch_ran_once_marker_file (GdmManager *manager) + { + int fd; + + fd = g_creat (GDM_RAN_ONCE_MARKER_FILE, 0644); + + if (fd < 0 && errno != EEXIST) { + g_warning ("could not create %s to mark run, this may cause auto login " + "to repeat: %m", GDM_RAN_ONCE_MARKER_FILE); + return; + } + + fsync (fd); + close (fd); + } + + static void ++clean_seed_session (GdmSession *session) ++{ ++ g_object_set_data (G_OBJECT (session), "gdm-display", NULL); ++ g_object_unref (session); ++} ++ ++static void + create_seed_session_for_display (GdmManager *manager, + GdmDisplay *display, + uid_t allowed_user) + { + GdmSession *session; + gboolean display_is_local = FALSE; + char *display_name = NULL; + char *display_device = NULL; + char *remote_hostname = NULL; + char *display_auth_file = NULL; + char *display_seat_id = NULL; + char *display_id = NULL; + + g_object_get (G_OBJECT (display), + "id", &display_id, + "x11-display-name", &display_name, + "is-local", &display_is_local, + "remote-hostname", &remote_hostname, + "x11-authority-file", &display_auth_file, + "seat-id", &display_seat_id, + NULL); + display_device = get_display_device (manager, display); + + session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN, + allowed_user, + display_name, + remote_hostname, + display_device, + display_seat_id, + display_auth_file, +@@ -1906,61 +1913,61 @@ create_seed_session_for_display (GdmManager *manager, + manager); + g_signal_connect (session, + "cancelled", + G_CALLBACK (on_session_cancelled), + manager); + g_signal_connect (session, + "conversation-started", + G_CALLBACK (on_session_conversation_started), + manager); + g_signal_connect (session, + "conversation-stopped", + G_CALLBACK (on_session_conversation_stopped), + manager); + g_signal_connect (session, + "session-opened", + G_CALLBACK (on_session_opened), + manager); + g_signal_connect (session, + "session-started", + G_CALLBACK (on_session_started), + manager); + g_signal_connect (session, + "session-exited", + G_CALLBACK (on_user_session_exited), + manager); + g_signal_connect (session, + "session-died", + G_CALLBACK (on_user_session_died), + manager); + g_object_set_data (G_OBJECT (session), "gdm-display", display); +- g_object_set_data_full (G_OBJECT (display), "gdm-seed-session", g_object_ref (session), (GDestroyNotify) g_object_unref); ++ g_object_set_data_full (G_OBJECT (display), "gdm-seed-session", g_object_ref (session), (GDestroyNotify) clean_seed_session); + + start_autologin_conversation_if_necessary (manager, display, session); + } + + static void + on_display_added (GdmDisplayStore *display_store, + const char *id, + GdmManager *manager) + { + GdmDisplay *display; + + display = gdm_display_store_lookup (display_store, id); + + if (display != NULL) { + g_dbus_object_manager_server_export (manager->priv->object_manager, + gdm_display_get_object_skeleton (display)); + + g_signal_connect (display, "notify::status", + G_CALLBACK (on_display_status_changed), + manager); + g_signal_emit (manager, signals[DISPLAY_ADDED], 0, id); + } + } + + GQuark + gdm_manager_error_quark (void) + { + static GQuark ret = 0; + if (ret == 0) { + ret = g_quark_from_static_string ("gdm_manager_error"); +-- +2.2.1 + diff --git a/gdm.spec b/gdm.spec index 7c0a040..afbdec1 100644 --- a/gdm.spec +++ b/gdm.spec @@ -12,7 +12,7 @@ Summary: The GNOME Display Manager Name: gdm Version: 3.15.3.1 -Release: 3%{?dist} +Release: 4%{?dist} Epoch: 1 License: GPLv2+ Group: User Interface/X @@ -298,6 +298,10 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || : %{_libdir}/pkgconfig/gdm.pc %changelog +* Fri Jan 23 2015 Ray Strode 3.15.3.1-4 +- Another user switching fix + Related: #1184933 + * Thu Jan 22 2015 Ray Strode 3.15.3.1-3 - Fix user switching Resolves: #1184933