logind: always enclose list fields (that may contain spaces) in quotes

This commit is contained in:
Lennart Poettering
2025-05-19 11:57:56 +02:00
parent 232f4e12fe
commit b0555149de
3 changed files with 34 additions and 23 deletions

View File

@@ -129,20 +129,19 @@ int seat_save(Seat *s) {
}
if (s->sessions) {
fputs("SESSIONS=", f);
LIST_FOREACH(sessions_by_seat, i, s->sessions) {
fprintf(f,
"%s%c",
i->id,
i->sessions_by_seat_next ? ' ' : '\n');
}
fputs("UIDS=", f);
fputs("SESSIONS=\"", f);
LIST_FOREACH(sessions_by_seat, i, s->sessions)
fprintf(f,
UID_FMT"%c",
"%s%s",
i->id,
i->sessions_by_seat_next ? " " : "\"\n");
fputs("UIDS=\"", f);
LIST_FOREACH(sessions_by_seat, i, s->sessions)
fprintf(f,
UID_FMT"%s",
i->user->user_record->uid,
i->sessions_by_seat_next ? ' ' : '\n');
i->sessions_by_seat_next ? " " : "\"\n");
}
r = flink_tmpfile(f, temp_path, s->state_file, LINK_TMPFILE_REPLACE);

View File

@@ -267,12 +267,19 @@ int session_set_leader_consume(Session *s, PidRef _leader) {
static void session_save_devices(Session *s, FILE *f) {
SessionDevice *sd;
if (!hashmap_isempty(s->devices)) {
fprintf(f, "DEVICES=");
HASHMAP_FOREACH(sd, s->devices)
fprintf(f, DEVNUM_FORMAT_STR " ", DEVNUM_FORMAT_VAL(sd->dev));
fprintf(f, "\n");
if (hashmap_isempty(s->devices))
return;
bool need_space = false;
fputs("DEVICES=\"", f);
HASHMAP_FOREACH(sd, s->devices) {
if (need_space)
fputc(' ', f);
fprintf(f, DEVNUM_FORMAT_STR, DEVNUM_FORMAT_VAL(sd->dev));
need_space = true;
}
fputs("\"\n", f);
}
int session_save(Session *s) {

View File

@@ -194,7 +194,7 @@ static int user_save_internal(User *u) {
if (u->sessions) {
bool first;
fputs("SESSIONS=", f);
fputs("SESSIONS=\"", f);
first = true;
LIST_FOREACH(sessions_by_user, i, u->sessions) {
if (first)
@@ -205,7 +205,8 @@ static int user_save_internal(User *u) {
fputs(i->id, f);
}
fputs("\nSEATS=", f);
fputs("\"\n"
"SEATS=\"", f);
first = true;
LIST_FOREACH(sessions_by_user, i, u->sessions) {
if (!i->seat)
@@ -219,7 +220,8 @@ static int user_save_internal(User *u) {
fputs(i->seat->id, f);
}
fputs("\nACTIVE_SESSIONS=", f);
fputs("\"\n"
"ACTIVE_SESSIONS=\"", f);
first = true;
LIST_FOREACH(sessions_by_user, i, u->sessions) {
if (!session_is_active(i))
@@ -233,7 +235,8 @@ static int user_save_internal(User *u) {
fputs(i->id, f);
}
fputs("\nONLINE_SESSIONS=", f);
fputs("\"\n"
"ONLINE_SESSIONS=\"", f);
first = true;
LIST_FOREACH(sessions_by_user, i, u->sessions) {
if (session_get_state(i) == SESSION_CLOSING)
@@ -247,7 +250,8 @@ static int user_save_internal(User *u) {
fputs(i->id, f);
}
fputs("\nACTIVE_SEATS=", f);
fputs("\"\n"
"ACTIVE_SEATS=\"", f);
first = true;
LIST_FOREACH(sessions_by_user, i, u->sessions) {
if (!session_is_active(i) || !i->seat)
@@ -261,7 +265,8 @@ static int user_save_internal(User *u) {
fputs(i->seat->id, f);
}
fputs("\nONLINE_SEATS=", f);
fputs("\"\n"
"ONLINE_SEATS=\"", f);
first = true;
LIST_FOREACH(sessions_by_user, i, u->sessions) {
if (session_get_state(i) == SESSION_CLOSING || !i->seat)
@@ -274,7 +279,7 @@ static int user_save_internal(User *u) {
fputs(i->seat->id, f);
}
fputc('\n', f);
fputs("\"\n", f);
}
r = flink_tmpfile(f, temp_path, u->state_file, LINK_TMPFILE_REPLACE);