[gdm/f14/master] Fix crashing in a loop

Ray Strode rstrode at fedoraproject.org
Mon Sep 13 14:29:17 UTC 2010


commit ca23ea4d1274abdfc074d033ee9b608c09facfdb
Author: Ray Strode <rstrode at redhat.com>
Date:   Mon Sep 13 10:27:33 2010 -0400

    Fix crashing in a loop
    
    This commit fixes up the last round of changes,
    which caused gdm to crash in a loop if the
    accounts service was enabled.

 fix-user-async-issue.patch |  119 +++++++++++++++++++++++++++++++++++++++++++-
 gdm.spec                   |    7 ++-
 2 files changed, 123 insertions(+), 3 deletions(-)
---
diff --git a/fix-user-async-issue.patch b/fix-user-async-issue.patch
index 7e9609b..146f388 100644
--- a/fix-user-async-issue.patch
+++ b/fix-user-async-issue.patch
@@ -876,7 +876,7 @@ index 25951ba..317b721 100644
          user->object_path = g_strdup (object_path);
  
          user->accounts_proxy = dbus_g_proxy_new_for_name (user->connection,
-@@ -1021,14 +1031,10 @@ gdm_user_new_from_object_path (const gchar *object_path)
+@@ -1021,14 +1031,9 @@ gdm_user_new_from_object_path (const gchar *object_path)
                                       G_CALLBACK (changed_handler), user, NULL);
  
          if (!update_info (user)) {
@@ -887,7 +887,7 @@ index 25951ba..317b721 100644
 -        return user;
 -
 - error:
-         g_object_unref (user);
+-        g_object_unref (user);
 -        return NULL;
  }
  
@@ -1063,3 +1063,118 @@ index 6964415..bd36380 100644
 -- 
 1.7.2.3
 
+From c690a9b51dca5700bb5e512e6f2e55d9440a145a Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 13 Sep 2010 10:15:34 -0400
+Subject: [PATCH 1/3] Change user manager user weak ref to strong ref
+
+The on_users_loaded function assumes it owns a
+strong reference to the user.
+---
+ gui/simple-greeter/gdm-user-manager.c |   10 +---------
+ 1 files changed, 1 insertions(+), 9 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
+index bd36380..305fd93 100644
+--- a/gui/simple-greeter/gdm-user-manager.c
++++ b/gui/simple-greeter/gdm-user-manager.c
+@@ -688,12 +688,6 @@ set_has_multiple_users (GdmUserManager *manager,
+                 g_object_notify (G_OBJECT (manager), "has-multiple-users");
+         }
+ }
+-static void
+-on_new_user_destroyed (GdmUserManager *manager,
+-                       GdmUser        *user)
+-{
+-        manager->priv->new_users = g_slist_remove (manager->priv->new_users, user);
+-}
+ 
+ static GdmUser *
+ create_new_user (GdmUserManager *manager)
+@@ -703,11 +697,10 @@ create_new_user (GdmUserManager *manager)
+         user = g_object_new (GDM_TYPE_USER, NULL);
+ 
+         manager->priv->new_users = g_slist_prepend (manager->priv->new_users, user);
+-        g_object_weak_ref (G_OBJECT (user), (GWeakNotify) on_new_user_destroyed, manager);
+ 
+         g_signal_connect (user, "notify::is-loaded", G_CALLBACK (on_new_user_loaded), manager);
+ 
+-        return user;
++        return g_object_ref (user);
+ }
+ 
+ static void
+@@ -784,7 +777,6 @@ on_new_user_loaded (GdmUser        *user,
+         g_signal_handlers_disconnect_by_func (user, on_new_user_loaded, manager);
+         manager->priv->new_users = g_slist_remove (manager->priv->new_users,
+                                                    user);
+-        g_object_weak_unref (G_OBJECT (user), (GWeakNotify) on_new_user_destroyed, manager);
+ 
+         username = gdm_user_get_user_name (user);
+ 
+-- 
+1.7.2.3
+
+
+From 9027a2cb3db2bbf603540b97ee1398a90053a026 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 13 Sep 2010 10:19:13 -0400
+Subject: [PATCH 2/3] Don't call update_item_for_user on non-users in userlist
+
+Previously, get_user() it would fail right away and we
+would avoid the call.  Now get_user() returns a unloaded
+stub object so we need to avoid calling get_user() in the
+first place.
+---
+ gui/simple-greeter/gdm-user-chooser-widget.c |    8 ++++++++
+ 1 files changed, 8 insertions(+), 0 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c
+index 211b033..5aa2cfa 100644
+--- a/gui/simple-greeter/gdm-user-chooser-widget.c
++++ b/gui/simple-greeter/gdm-user-chooser-widget.c
+@@ -235,6 +235,14 @@ on_item_load (GdmChooserWidget     *widget,
+                 return;
+         }
+ 
++        if (strcmp (id, GDM_USER_CHOOSER_USER_OTHER) == 0) {
++                return;
++        }
++
++        if (strcmp (id, GDM_USER_CHOOSER_USER_GUEST) == 0) {
++                return;
++        }
++
+         user = gdm_user_manager_get_user (user_chooser->priv->manager, id);
+         if (user != NULL) {
+                 update_item_for_user (user_chooser, user);
+-- 
+1.7.2.3
+
+
+From f274e6bdc79d4b620b62a3aca120426bb24f3977 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 13 Sep 2010 10:21:57 -0400
+Subject: [PATCH 3/3] Make update_item_for_user a no-op if user unloaded
+
+---
+ gui/simple-greeter/gdm-user-chooser-widget.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c
+index 5aa2cfa..4a79c58 100644
+--- a/gui/simple-greeter/gdm-user-chooser-widget.c
++++ b/gui/simple-greeter/gdm-user-chooser-widget.c
+@@ -185,6 +185,9 @@ update_item_for_user (GdmUserChooserWidget *widget,
+         char         *escaped_username;
+         char         *escaped_real_name;
+ 
++        if (!gdm_user_is_loaded (user)) {
++                return;
++        }
+ 
+         size = get_icon_height_for_widget (GTK_WIDGET (widget));
+         pixbuf = gdm_user_render_icon (user, size);
+-- 
+1.7.2.3
+
diff --git a/gdm.spec b/gdm.spec
index 5dd3101..1f8d6d3 100644
--- a/gdm.spec
+++ b/gdm.spec
@@ -15,7 +15,7 @@
 Summary: The GNOME Display Manager
 Name: gdm
 Version: 2.31.90
-Release: 5%{?dist}
+Release: 6%{?dist}
 Epoch: 1
 License: GPLv2+
 Group: User Interface/X
@@ -374,6 +374,11 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/ull || :
 %{_libdir}/gdm/simple-greeter/plugins/fingerprint.so
 
 %changelog
+* Mon Sep 13 2010 Ray Strode <rstrode at redhat.com> 2.31.90-6
+- Fix crashing-in-a-loop gdm when accounts service is enabled
+  (caused by -5)
+  Resolves: #632818
+
 * Fri Sep 10 2010 Ray Strode <rstrode at redhat.com> 2.31.90-5
 - Fix user switch applet when accounts service is disabled
   Resolves: #632490


More information about the scm-commits mailing list