diff --git a/accountsservice.spec b/accountsservice.spec index d68c9cf..c0e5f9d 100644 --- a/accountsservice.spec +++ b/accountsservice.spec @@ -1,7 +1,7 @@ Name: accountsservice Version: 0.6.10 -Release: 1%{?dist} +Release: 2%{?dist} Summary: D-Bus interfaces for querying and manipulating user account information Group: System Environment/Daemons @@ -21,6 +21,8 @@ Requires: polkit Requires: ConsoleKit Requires: shadow-utils +Patch0: fix-sgallaghs-machine.patch + %package libs Summary: Client-side library to talk to accountservice Group: Development/Libraries @@ -50,6 +52,7 @@ of these interfaces, based on the useradd, usermod and userdel commands. %prep %setup -q +%patch0 -p1 -b .fix-sgallaghs-machine %build %configure @@ -88,6 +91,10 @@ rm $RPM_BUILD_ROOT%{_libdir}/*.a %{_datadir}/gir-1.0/AccountsService-1.0.gir %changelog +* Tue May 10 2011 Ray Strode 0.6.10-2 +- Fix more user list hang problems + Resolves: #703569 + * Fri Apr 29 2011 Ray Strode 0.6.10-1 - Update to 0.6.10 diff --git a/fix-sgallaghs-machine.patch b/fix-sgallaghs-machine.patch new file mode 100644 index 0000000..5ed5717 --- /dev/null +++ b/fix-sgallaghs-machine.patch @@ -0,0 +1,213 @@ +From 21bf283256cb111996f606aec11e6521cc89ce3f Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 10 May 2011 14:19:57 -0400 +Subject: [PATCH 1/4] daemon: stall ListCachedUsers until ck-history finishes + +This way we don't normally return an empty list in early +calls for systems that have network login enabled. +--- + src/daemon.c | 33 +++++++++++++++++++++++++++++++-- + 1 files changed, 31 insertions(+), 2 deletions(-) + +diff --git a/src/daemon.c b/src/daemon.c +index a463c46..2a18924 100644 +--- a/src/daemon.c ++++ b/src/daemon.c +@@ -88,6 +88,7 @@ enum { + enum { + USER_ADDED, + USER_REMOVED, ++ CK_HISTORY_LOADED, + LAST_SIGNAL + }; + +@@ -204,6 +205,16 @@ daemon_class_init (DaemonClass *klass) + 1, + DBUS_TYPE_G_OBJECT_PATH); + ++ signals[CK_HISTORY_LOADED] = g_signal_new ("ck-history-loaded", ++ G_OBJECT_CLASS_TYPE (klass), ++ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, ++ 0, ++ NULL, ++ NULL, ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, ++ 0); ++ + dbus_g_object_type_install_info (TYPE_DAEMON, + &dbus_glib_daemon_object_info); + +@@ -393,6 +404,7 @@ ck_history_watch (GIOChannel *source, + + if (done) { + daemon->priv->ck_history_id = 0; ++ g_signal_emit (daemon, signals[CK_HISTORY_LOADED], 0); + return FALSE; + } + +@@ -1045,6 +1057,18 @@ finish_list_cached_users (gpointer user_data) + return FALSE; + } + ++static void ++on_ck_history_loaded (Daemon *daemon, ++ ListUserData *data) ++{ ++ /* ck-history loaded, so finish pending ListCachedUsers call */ ++ g_idle_add (finish_list_cached_users, data); ++ ++ g_signal_handlers_disconnect_by_func (daemon, ++ on_ck_history_loaded, ++ data); ++} ++ + gboolean + daemon_list_cached_users (Daemon *daemon, + DBusGMethodInvocation *context) +@@ -1053,8 +1077,13 @@ daemon_list_cached_users (Daemon *daemon, + + data = list_user_data_new (daemon, context); + +- if (daemon->priv->reload_id > 0) { +- /* reload in progress, wait */ ++ if (daemon->priv->ck_history_id > 0) { ++ /* loading ck-history, wait for it */ ++ g_signal_connect (daemon, "ck-history-loaded", ++ G_CALLBACK (on_ck_history_loaded), ++ data); ++ } else if (daemon->priv->reload_id > 0) { ++ /* reload in progress, wait a bit */ + g_idle_add (finish_list_cached_users, data); + } + else { +-- +1.7.5 + + +From 47a5d95908a1005e2d44728a0d7e2459965190ef Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 10 May 2011 14:21:16 -0400 +Subject: [PATCH 2/4] lib: ignore user-removed signals for untracked users + +If we don't know about a user, we don't care if it goes away, +and we shouldn't try to remove it from the book keeping. +--- + src/libaccountsservice/act-user-manager.c | 9 +++++++-- + 1 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c +index 379c972..cbf7fc8 100644 +--- a/src/libaccountsservice/act-user-manager.c ++++ b/src/libaccountsservice/act-user-manager.c +@@ -878,10 +878,15 @@ on_user_removed_in_accounts_service (DBusGProxy *proxy, + ActUserManager *manager = ACT_USER_MANAGER (user_data); + ActUser *user; + +- g_debug ("ActUserManager: user removed from accounts service with object path %s", object_path); +- + user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path); + ++ if (user == NULL) { ++ g_debug ("ActUserManager: ignoring untracked user %s", object_path); ++ return; ++ } else { ++ g_debug ("ActUserManager: tracked user %s removed from accounts service", object_path); ++ } ++ + manager->priv->new_users = g_slist_remove (manager->priv->new_users, user); + + remove_user (manager, user); +-- +1.7.5 + + +From 53948a60b012b0bf5aa4d72eb973aee9964d2ca4 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 10 May 2011 14:36:02 -0400 +Subject: [PATCH 3/4] lib: set is-loaded in failure path + +We want to make sure that we always set is-loaded when +things fail, so that we don't block indefinitely. +--- + src/libaccountsservice/act-user-manager.c | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c +index cbf7fc8..3764ab9 100644 +--- a/src/libaccountsservice/act-user-manager.c ++++ b/src/libaccountsservice/act-user-manager.c +@@ -572,10 +572,9 @@ on_get_seat_id_finished (DBusGProxy *proxy, + g_debug ("Failed to identify the seat of the " + "current session"); + } +- unload_seat (manager); + +- g_debug ("ActUserManager: GetSeatId call failed, so trying to set loaded property"); +- maybe_set_is_loaded (manager); ++ g_debug ("ActUserManager: GetSeatId call failed, so unloading seat"); ++ unload_seat (manager); + return; + } + +@@ -924,8 +923,6 @@ on_get_current_session_finished (DBusGProxy *proxy, + g_debug ("Failed to identify the current session"); + } + unload_seat (manager); +- g_debug ("ActUserManager: no current session, so trying to set loaded property"); +- maybe_set_is_loaded (manager); + return; + } + +@@ -1549,6 +1546,9 @@ unload_seat (ActUserManager *manager) + + g_free (manager->priv->seat.session_id); + manager->priv->seat.session_id = NULL; ++ ++ g_debug ("ActUserManager: seat unloaded, so trying to set loaded property"); ++ maybe_set_is_loaded (manager); + } + + static void +-- +1.7.5 + + +From 1932d53d3717bb8aa97307b903fba10371baa9b6 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 10 May 2011 14:36:40 -0400 +Subject: [PATCH 4/4] lib: if ListCachedUsers returns zero users continue + +We currently block for ListCachedUsers to finish. + +If after it finishes, we find out it returns 0 zero users +we end up hanging indefinitely. + +This commit fixes that. +--- + src/libaccountsservice/act-user-manager.c | 9 +++++++-- + 1 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c +index 3764ab9..6b4c77e 100644 +--- a/src/libaccountsservice/act-user-manager.c ++++ b/src/libaccountsservice/act-user-manager.c +@@ -1216,8 +1216,13 @@ on_list_cached_users_finished (DBusGProxy *proxy, + * + * (see on_new_user_loaded) + */ +- g_debug ("ActUserManager: ListCachedUsers finished, will set loaded property after list is fully loaded"); +- g_ptr_array_foreach (paths, (GFunc)add_new_inhibiting_user_for_object_path, manager); ++ if (paths->len > 0) { ++ g_debug ("ActUserManager: ListCachedUsers finished, will set loaded property after list is fully loaded"); ++ g_ptr_array_foreach (paths, (GFunc)add_new_inhibiting_user_for_object_path, manager); ++ } else { ++ g_debug ("ActUserManager: ListCachedUsers finished with empty list, maybe setting loaded property now"); ++ maybe_set_is_loaded (manager); ++ } + + g_ptr_array_foreach (paths, (GFunc)g_free, NULL); + g_ptr_array_free (paths, TRUE); +-- +1.7.5 +