summaryrefslogtreecommitdiff
path: root/src/login/logind-session.c
diff options
context:
space:
mode:
authorOwen W. Taylor <otaylor@fishsoup.net>2015-08-18 15:19:05 -0400
committerOwen W. Taylor <otaylor@fishsoup.net>2015-08-18 15:26:11 -0400
commit128df4cfe93e6de6afb38a2160167339d88f4e1a (patch)
tree1b9056549b4260bed2a5fedc928f092d3967848b /src/login/logind-session.c
parent2235695335c56cf91df8dbae0ea49889b209da17 (diff)
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
Diffstat (limited to 'src/login/logind-session.c')
-rw-r--r--src/login/logind-session.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 902abe0e42..92a6027a7e 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -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;