Description: Remove user cache files if user account no longer exists Origin: https://launchpad.net/bugs/1259562 Forwarded: https://bugs.freedesktop.org/72596 Author: Gunnar Hjalmarsson Last-Update: 2013-12-13 --- accountsservice-0.6.35.orig/src/daemon.c 2013-10-15 22:25:19.000000000 +0200 +++ accountsservice-0.6.35/src/daemon.c 2013-12-13 18:48:49.412006608 +0100 @@ -162,6 +162,20 @@ g_free (previous_login); } +static void +remove_cache_files (const gchar *user_name) +{ + gchar *filename; + + filename = g_build_filename (USERDIR, user_name, NULL); + g_remove (filename); + g_free (filename); + + filename = g_build_filename (ICONDIR, user_name, NULL); + g_remove (filename); + g_free (filename); +} + static struct passwd * entry_generator_wtmp (GHashTable *users, gpointer *state) @@ -374,11 +388,17 @@ g_free (filename); if (regular) { + errno = 0; pwent = getpwnam (name); - if (pwent == NULL) - g_debug ("user '%s' in cache dir but not present on system", name); - else + if (pwent != NULL) return pwent; + else if (errno == 0) { + g_debug ("user '%s' in cache dir but not present on system, removing", name); + remove_cache_files (name); + } + else + g_warning ("failed to check if user '%s' in cache dir is present on system: %s", + name, g_strerror (errno)); } } @@ -1184,7 +1204,6 @@ gpointer data) { const gchar *user_name = data; - gchar *filename; User *user; sys_log (context, "uncache user '%s'", user_name); @@ -1199,13 +1218,7 @@ /* Always use the canonical user name looked up */ user_name = user_get_user_name (user); - filename = g_build_filename (USERDIR, user_name, NULL); - g_remove (filename); - g_free (filename); - - filename = g_build_filename (ICONDIR, user_name, NULL); - g_remove (filename); - g_free (filename); + remove_cache_files (user_name); accounts_accounts_complete_uncache_user (NULL, context); @@ -1245,7 +1258,6 @@ { DeleteUserData *ud = data; GError *error; - gchar *filename; struct passwd *pwent; const gchar *argv[6]; @@ -1272,13 +1284,7 @@ } - filename = g_build_filename (USERDIR, pwent->pw_name, NULL); - g_remove (filename); - g_free (filename); - - filename = g_build_filename (ICONDIR, pwent->pw_name, NULL); - g_remove (filename); - g_free (filename); + remove_cache_files (pwent->pw_name); argv[0] = "/usr/sbin/userdel"; if (ud->remove_files) {