summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorMichal Koutný <mkoutny@suse.com>2022-11-25 17:25:36 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-11-26 08:27:16 +0900
commitf38e89c23ce52efa27bb47f5c3dafecdb987492b (patch)
tree34452e4bf300a93031c050b2bfabf142c92ae6e4 /src/login
parent5bd346feb79ebcd16f8c01702fd2adabb4699426 (diff)
downloadsystemd-f38e89c23ce52efa27bb47f5c3dafecdb987492b.tar.gz
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
Diffstat (limited to 'src/login')
-rw-r--r--src/login/logind.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/login/logind.c b/src/login/logind.c
index cc153fd6bf..a564f94bfe 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);
}