summaryrefslogtreecommitdiffstats
path: root/sys/kern/tty.c
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-06-15 19:17:52 +0000
committered <ed@FreeBSD.org>2009-06-15 19:17:52 +0000
commit7de50e3afbbea1bd7bb7ea5fe5f087167ff7980e (patch)
treefa0fa19b7b868432e961c6655510a999e74566d3 /sys/kern/tty.c
parentf950eed7d778168cbdc3411fb2604c92e03531b8 (diff)
downloadFreeBSD-src-7de50e3afbbea1bd7bb7ea5fe5f087167ff7980e.zip
FreeBSD-src-7de50e3afbbea1bd7bb7ea5fe5f087167ff7980e.tar.gz
Make tcsetsid(3) work on revoked TTYs.
Right now the only way to make tcsetsid(3)/TIOCSCTTY work, is by ensuring the session leader is dead. This means that an application that catches SIGHUPs and performs a sleep prevents us from assigning a new session leader. Change the code to make it work on revoked TTYs as well. This allows us to change init(8) to make the shutdown script run in a more clean environment.
Diffstat (limited to 'sys/kern/tty.c')
-rw-r--r--sys/kern/tty.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 162ae37..bf800be 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -1487,15 +1487,18 @@ tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td)
}
if (p->p_session->s_ttyvp != NULL ||
- (tp->t_session != NULL && tp->t_session->s_ttyvp != NULL)) {
+ (tp->t_session != NULL && tp->t_session->s_ttyvp != NULL &&
+ tp->t_session->s_ttyvp->v_type != VBAD)) {
/*
* There is already a relation between a TTY and
* a session, or the caller is not the session
* leader.
*
* Allow the TTY to be stolen when the vnode is
- * NULL, but the reference to the TTY is still
- * active.
+ * invalid, but the reference to the TTY is
+ * still active. This allows immediate reuse of
+ * TTYs of which the session leader has been
+ * killed or the TTY revoked.
*/
sx_xunlock(&proctree_lock);
return (EPERM);
OpenPOWER on IntegriCloud