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
This commit is contained in:
Michal Koutný
2022-11-26 08:27:16 +09:00
committed by Yu Watanabe
parent 5bd346feb7
commit f38e89c23c
+8 -2
View File
@@ -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);
}