[gdm] Another user switching fix
Ray Strode
rstrode at fedoraproject.org
Fri Jan 23 19:31:22 UTC 2015
commit c1c3fec98b406f8783dfa9bfe246f4638e8d650a
Author: Ray Strode <rstrode at redhat.com>
Date: Fri Jan 23 14:31:33 2015 -0500
Another user switching fix
Related: #1184933
fix-user-switching.patch | 154 ++++++++++++++++++++++++++++++++++++++++++++++
gdm.spec | 6 ++-
2 files changed, 159 insertions(+), 1 deletions(-)
---
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 <rstrode at redhat.com>
+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 <rstrode at redhat.com> 3.15.3.1-4
+- Another user switching fix
+ Related: #1184933
+
* Thu Jan 22 2015 Ray Strode <rstrode at redhat.com> 3.15.3.1-3
- Fix user switching
Resolves: #1184933
More information about the scm-commits
mailing list