From: Michal Koutný Date: Fri, 25 Nov 2022 16:25:36 +0000 (+0100) Subject: logind: Properly unescape names of lingering users X-Git-Tag: v253-rc1~442 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f38e89c23ce52efa27bb47f5c3dafecdb987492b;p=thirdparty%2Fsystemd.git logind: Properly unescape names of lingering users Filenames to store user linger requests are created with C-escaping. When we enumerate the files to acquire ligering users, we use the filenames verbatim. In the case C-escaping is not an identity map (such as "DOMAIN\User"), we won't be able to start user instances of such mangled users. Unescape filenames when we treat them as usernames again. Fixes: #25448 --- diff --git a/src/login/logind.c b/src/login/logind.c index cc153fd6bfd..a564f94bfe9 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -18,6 +18,7 @@ #include "daemon-util.h" #include "device-util.h" #include "dirent-util.h" +#include "escape.h" #include "fd-util.h" #include "format-util.h" #include "fs-util.h" @@ -299,11 +300,16 @@ static int manager_enumerate_linger_users(Manager *m) { FOREACH_DIRENT(de, d, return -errno) { int k; + _cleanup_free_ char *n = NULL; if (!dirent_is_file(de)) continue; - - k = manager_add_user_by_name(m, de->d_name, NULL); + k = cunescape(de->d_name, 0, &n); + if (k < 0) { + r = log_warning_errno(k, "Failed to unescape username '%s', ignoring: %m", de->d_name); + continue; + } + k = manager_add_user_by_name(m, n, NULL); if (k < 0) r = log_warning_errno(k, "Couldn't add lingering user %s, ignoring: %m", de->d_name); }