diff options
author | Franck Bui <fbui@suse.com> | 2019-01-10 12:17:51 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-01-10 15:59:13 +0100 |
commit | c0f34168d4c5691fccb62e81d6d49dd2f730a17b (patch) | |
tree | ed16f84925827f27af52dccc90c83e4f401dcbdf /src/login | |
parent | c7e93c4d15019323973baf12daa76357c83892c4 (diff) | |
download | systemd-c0f34168d4c5691fccb62e81d6d49dd2f730a17b.tar.gz systemd-c0f34168d4c5691fccb62e81d6d49dd2f730a17b.tar.bz2 systemd-c0f34168d4c5691fccb62e81d6d49dd2f730a17b.zip |
Revert "logind: become the controlling terminal process before restoring VT"
This reverts commit ad96887a1205bad9656d280c5681f482e6d04838.
Commit adb8688 alone should be enough to fix issue #9754.
Fixes #11269
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/logind-session.c | 58 |
1 files changed, 15 insertions, 43 deletions
diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 4b4dd4c060..90a9108566 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -1227,54 +1227,26 @@ error: } static void session_restore_vt(Session *s) { - pid_t pid; - int r; - - if (s->vtnr < 1) - return; + int r, vt, old_fd; - if (s->vtfd < 0) - return; - - /* The virtual terminal can potentially be entering in hung-up state at any time - * depending on when the controlling process exits. - * - * If the controlling process exits while we're restoring the virtual terminal, - * the VT will enter in hung-up state and we'll fail at restoring it. To prevent - * this case, we kick off the current controlling process (if any) in a child - * process so logind doesn't play around with tty ownership. - * - * If the controlling process already exited, getting a fresh handle to the - * virtual terminal reset the hung-up state. */ - r = safe_fork("(logind)", FORK_REOPEN_LOG|FORK_CLOSE_ALL_FDS|FORK_RESET_SIGNALS|FORK_WAIT|FORK_LOG, &pid); - if (r == 0) { - char path[sizeof("/dev/tty") + DECIMAL_STR_MAX(s->vtnr)]; - int vt; - - /* We must be a session leader in order to become the controlling process. */ - pid = setsid(); - if (pid < 0) { - log_error_errno(errno, "Failed to become session leader: %m"); - _exit(EXIT_FAILURE); - } + /* 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. + */ + old_fd = TAKE_FD(s->vtfd); - sprintf(path, "/dev/tty%u", s->vtnr); - vt = acquire_terminal(path, ACQUIRE_TERMINAL_FORCE, USEC_INFINITY); - if (vt < 0) { - log_error_errno(vt, "Cannot acquire VT %s of session %s: %m", path, s->id); - _exit(EXIT_FAILURE); - } + vt = session_open_vt(s); + safe_close(old_fd); - r = vt_restore(vt); - if (r < 0) - log_warning_errno(r, "Failed to restore VT, ignoring: %m"); + if (vt < 0) + return; - /* Give up and release the controlling terminal. */ - safe_close(vt); - _exit(EXIT_SUCCESS); - } + r = vt_restore(vt); + if (r < 0) + log_warning_errno(r, "Failed to restore VT, ignoring: %m"); - /* Close the fd in any cases. */ s->vtfd = safe_close(s->vtfd); } |