diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2007-05-08 03:26:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 14:15:04 -0400 |
commit | 98a27ba485c7508ef9d9527fe06e4686f3a163dc (patch) | |
tree | 73d5dca7f1b5120ecf1bbcc664094044bc35dc56 /drivers/char/tty_io.c | |
parent | 2a65f1d9fe78475720bd8f0e0fbbf1973b1b5ac2 (diff) |
tty: introduce no_tty and use it in selinux
While researching the tty layer pid leaks I found a weird case in selinux when
we drop a controlling tty because of inadequate permissions we don't do the
normal hangup processing. Which is a problem if it happens the session leader
has exec'd something that can no longer access the tty.
We already have code in the kernel to handle this case in the form of the
TIOCNOTTY ioctl. So this patch factors out a helper function that is the
essence of that ioctl and calls it from the selinux code.
This removes the inconsistency in handling dropping of a controlling tty and
who knows it might even make some part of user space happy because it received
a SIGHUP it was expecting.
In addition since this removes the last user of proc_set_tty outside of
tty_io.c proc_set_tty is made static and removed from tty.h
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: James Morris <jmorris@namei.org>
Cc: Stephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/tty_io.c')
-rw-r--r-- | drivers/char/tty_io.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 39db186d5c5b..5d405a1bfbe3 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -154,6 +154,7 @@ int tty_ioctl(struct inode * inode, struct file * file, | |||
154 | static int tty_fasync(int fd, struct file * filp, int on); | 154 | static int tty_fasync(int fd, struct file * filp, int on); |
155 | static void release_tty(struct tty_struct *tty, int idx); | 155 | static void release_tty(struct tty_struct *tty, int idx); |
156 | static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty); | 156 | static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty); |
157 | static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty); | ||
157 | 158 | ||
158 | /** | 159 | /** |
159 | * alloc_tty_struct - allocate a tty object | 160 | * alloc_tty_struct - allocate a tty object |
@@ -1558,6 +1559,18 @@ void disassociate_ctty(int on_exit) | |||
1558 | unlock_kernel(); | 1559 | unlock_kernel(); |
1559 | } | 1560 | } |
1560 | 1561 | ||
1562 | /** | ||
1563 | * | ||
1564 | * no_tty - Ensure the current process does not have a controlling tty | ||
1565 | */ | ||
1566 | void no_tty(void) | ||
1567 | { | ||
1568 | struct task_struct *tsk = current; | ||
1569 | if (tsk->signal->leader) | ||
1570 | disassociate_ctty(0); | ||
1571 | proc_clear_tty(tsk); | ||
1572 | } | ||
1573 | |||
1561 | 1574 | ||
1562 | /** | 1575 | /** |
1563 | * stop_tty - propogate flow control | 1576 | * stop_tty - propogate flow control |
@@ -3280,9 +3293,7 @@ int tty_ioctl(struct inode * inode, struct file * file, | |||
3280 | case TIOCNOTTY: | 3293 | case TIOCNOTTY: |
3281 | if (current->signal->tty != tty) | 3294 | if (current->signal->tty != tty) |
3282 | return -ENOTTY; | 3295 | return -ENOTTY; |
3283 | if (current->signal->leader) | 3296 | no_tty(); |
3284 | disassociate_ctty(0); | ||
3285 | proc_clear_tty(current); | ||
3286 | return 0; | 3297 | return 0; |
3287 | case TIOCSCTTY: | 3298 | case TIOCSCTTY: |
3288 | return tiocsctty(tty, arg); | 3299 | return tiocsctty(tty, arg); |
@@ -3844,7 +3855,7 @@ static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty) | |||
3844 | tsk->signal->tty_old_pgrp = NULL; | 3855 | tsk->signal->tty_old_pgrp = NULL; |
3845 | } | 3856 | } |
3846 | 3857 | ||
3847 | void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty) | 3858 | static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty) |
3848 | { | 3859 | { |
3849 | spin_lock_irq(&tsk->sighand->siglock); | 3860 | spin_lock_irq(&tsk->sighand->siglock); |
3850 | __proc_set_tty(tsk, tty); | 3861 | __proc_set_tty(tsk, tty); |