chiark / gitweb /
logind: get a fresh file descriptor to clean up a VT
[elogind.git] / src / login / logind-session.c
index 39eab71..1a5c76b 100644 (file)
@@ -981,7 +981,7 @@ static int session_open_vt(Session *s) {
                 return s->vtfd;
 
         sprintf(path, "/dev/tty%u", s->vtnr);
-        s->vtfd = open(path, O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY);
+        s->vtfd = open_terminal(path, O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY);
         if (s->vtfd < 0)
                 return log_error_errno(errno, "cannot open VT %s of session %s: %m", path, s->id);
 
@@ -1045,7 +1045,18 @@ void session_restore_vt(Session *s) {
         int vt, kb = K_XLATE;
         struct vt_mode mode = { 0 };
 
+        /* We need to get a fresh handle to the virtual terminal,
+         * since the old file-descriptor is potentially in a hung-up
+         * state after the controlling process exited; we do a
+         * little dance to avoid having the terminal be available
+         * for reuse before we've cleaned it up.
+         */
+        int old_fd = s->vtfd;
+        s->vtfd = -1;
+
         vt = session_open_vt(s);
+        safe_close(old_fd);
+
         if (vt < 0)
                 return;