chiark / gitweb /
logind: require VTs on seat0 and forbid elsewhere
authorDavid Herrmann <dh.herrmann@gmail.com>
Thu, 28 Nov 2013 16:25:25 +0000 (17:25 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Thu, 28 Nov 2013 16:41:38 +0000 (17:41 +0100)
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.

src/login/logind-dbus.c
src/login/logind-seat.c
src/login/logind-session.c

index 4239b3788a83bd70b93130a297b7295874071b1e..9538150e2e548c6051a75357c5d5e95f3056d64e 100644 (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)
index eac5a5f26b144de064d61ea0ea0a9183a52c248f..b1a5ec30efed713e21b7534e12623ce720c8ec9b 100644 (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);
 
index cd87088456782b07d2b72756ca83a882d03277f4..a72b13ee0363c3826836706c36c4f4dd64439c00 100644 (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);