From 7ab92b1ef2b8f20ed7d2cab528217ad65bdd52f5 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 4 May 2018 16:43:03 -0400 Subject: [PATCH] daemon: unregister user after we're done with it not before Now that we get the object path for a user directly from the skeleton, we can't access that object path after the skeleton is unregistered. This commit fixes a problem where the user deletion handling code tries to access the object path of a user after its skeleton is unregistered. https://bugs.freedesktop.org/show_bug.cgi?id=106455 --- src/daemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/daemon.c b/src/daemon.c index 9ec153a..d3fa971 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -483,63 +483,63 @@ reload_users (Daemon *daemon) if (!user_get_system_account (user)) number_of_normal_users++; user_update_local_account_property (user, g_hash_table_lookup (local, name) != NULL); } g_hash_table_destroy (local); had_no_users = accounts_accounts_get_has_no_users (accounts); has_no_users = number_of_normal_users == 0; if (had_no_users != has_no_users) accounts_accounts_set_has_no_users (accounts, has_no_users); had_multiple_users = accounts_accounts_get_has_multiple_users (accounts); has_multiple_users = number_of_normal_users > 1; if (had_multiple_users != has_multiple_users) accounts_accounts_set_has_multiple_users (accounts, has_multiple_users); /* Swap out the users */ old_users = daemon->priv->users; daemon->priv->users = users; /* Remove all the old users */ g_hash_table_iter_init (&iter, old_users); while (g_hash_table_iter_next (&iter, &name, (gpointer *)&user)) { User *refreshed_user; refreshed_user = g_hash_table_lookup (users, name); if (!refreshed_user || !user_get_cached (refreshed_user)) { - user_unregister (user); accounts_accounts_emit_user_deleted (ACCOUNTS_ACCOUNTS (daemon), user_get_object_path (user)); + user_unregister (user); } } /* Register all the new users */ g_hash_table_iter_init (&iter, users); while (g_hash_table_iter_next (&iter, &name, (gpointer *)&user)) { User *stale_user; stale_user = g_hash_table_lookup (old_users, name); if (!stale_user || !user_get_cached (stale_user) && user_get_cached (user)) { user_register (user); accounts_accounts_emit_user_added (ACCOUNTS_ACCOUNTS (daemon), user_get_object_path (user)); } g_object_thaw_notify (G_OBJECT (user)); } g_hash_table_destroy (old_users); } static gboolean reload_users_timeout (Daemon *daemon) { reload_users (daemon); daemon->priv->reload_id = 0; return FALSE; } -- 2.17.0