logind: get a fresh file descriptor to clean up a VT

When the controlling process exits, any existing file descriptors
for that FD will be marked as hung-up and ioctls on them will
file with EIO. To work around this, open a new file descriptor
for the VT we want to clean up.

Thanks to Ray Strode for help in sorting out the problem and
coming up with a fix!

https://github.com/systemd/systemd/issues/989
This commit is contained in:
Owen W. Taylor 2015-08-18 15:19:05 -04:00
parent 2235695335
commit 128df4cfe9
1 changed files with 11 additions and 0 deletions

View File

@ -1050,7 +1050,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;