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:
David Herrmann 2013-11-28 17:25:25 +01:00
parent 92bd5ff3a0
commit c506027af8
3 changed files with 12 additions and 9 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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);