mirror of
https://github.com/systemd/systemd.git
synced 2025-01-26 14:04:03 +03:00
logind: require VTs on seat0 and forbid elsewhere
Sessions on seat0 must pass us a vtnr, otherwise, you shouldn't try attaching it to seat0. For seats without VTs, we do the exact opposite: we forbid VTs. There can be odd situations if the session-files contain invalid combinations. However, we try to keep sessions alive and restore state as good as possible.
This commit is contained in:
parent
92bd5ff3a0
commit
c506027af8
@ -514,7 +514,7 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use
|
||||
|
||||
if (seat) {
|
||||
if (seat_has_vts(seat)) {
|
||||
if (vtnr > 63)
|
||||
if (!vtnr || vtnr > 63)
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "VT number out of range");
|
||||
} else {
|
||||
if (vtnr != 0)
|
||||
|
@ -408,6 +408,9 @@ int seat_attach_session(Seat *s, Session *session) {
|
||||
assert(session);
|
||||
assert(!session->seat);
|
||||
|
||||
if (!seat_has_vts(s) != !session->vtnr)
|
||||
return -EINVAL;
|
||||
|
||||
session->seat = s;
|
||||
LIST_PREPEND(sessions_by_seat, s->sessions, session);
|
||||
|
||||
|
@ -334,21 +334,21 @@ int session_load(Session *s) {
|
||||
s->remote = k;
|
||||
}
|
||||
|
||||
if (vtnr)
|
||||
safe_atou(vtnr, &s->vtnr);
|
||||
|
||||
if (seat && !s->seat) {
|
||||
Seat *o;
|
||||
|
||||
o = hashmap_get(s->manager->seats, seat);
|
||||
if (o)
|
||||
seat_attach_session(o, s);
|
||||
r = seat_attach_session(o, s);
|
||||
if (!o || r < 0)
|
||||
log_error("Cannot attach session %s to seat %s", s->id, seat);
|
||||
}
|
||||
|
||||
if (vtnr && s->seat && seat_has_vts(s->seat)) {
|
||||
unsigned int v;
|
||||
|
||||
k = safe_atou(vtnr, &v);
|
||||
if (k >= 0 && v >= 1)
|
||||
s->vtnr = v;
|
||||
}
|
||||
if (!s->seat || !seat_has_vts(s->seat))
|
||||
s->vtnr = 0;
|
||||
|
||||
if (leader) {
|
||||
k = parse_pid(leader, &s->leader);
|
||||
|
Loading…
x
Reference in New Issue
Block a user