1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-03-08 20:58:20 +03:00

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
(cherry picked from commit f38e89c23ce52efa27bb47f5c3dafecdb987492b)
(cherry picked from commit 6cbf72a8d9976ba182587cf62e2b7b8ae00ae2dd)
This commit is contained in:
Michal Koutný 2022-11-25 17:25:36 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent 0fbb019020
commit 95b20a94fb

View File

@ -18,6 +18,7 @@
#include "def.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);
}