diff options
-rw-r--r-- | drivers/char/tty_io.c | 19 | ||||
-rw-r--r-- | include/linux/tty.h | 2 | ||||
-rw-r--r-- | security/selinux/hooks.c | 7 |
3 files changed, 19 insertions, 9 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); |
diff --git a/include/linux/tty.h b/include/linux/tty.h index dee72b9a20fb..bb4576085203 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -313,6 +313,7 @@ extern int tty_hung_up_p(struct file * filp); | |||
313 | extern void do_SAK(struct tty_struct *tty); | 313 | extern void do_SAK(struct tty_struct *tty); |
314 | extern void __do_SAK(struct tty_struct *tty); | 314 | extern void __do_SAK(struct tty_struct *tty); |
315 | extern void disassociate_ctty(int priv); | 315 | extern void disassociate_ctty(int priv); |
316 | extern void no_tty(void); | ||
316 | extern void tty_flip_buffer_push(struct tty_struct *tty); | 317 | extern void tty_flip_buffer_push(struct tty_struct *tty); |
317 | extern speed_t tty_get_baud_rate(struct tty_struct *tty); | 318 | extern speed_t tty_get_baud_rate(struct tty_struct *tty); |
318 | extern speed_t tty_termios_baud_rate(struct ktermios *termios); | 319 | extern speed_t tty_termios_baud_rate(struct ktermios *termios); |
@@ -333,7 +334,6 @@ extern int tty_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
333 | 334 | ||
334 | extern dev_t tty_devnum(struct tty_struct *tty); | 335 | extern dev_t tty_devnum(struct tty_struct *tty); |
335 | extern void proc_clear_tty(struct task_struct *p); | 336 | extern void proc_clear_tty(struct task_struct *p); |
336 | extern void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty); | ||
337 | extern struct tty_struct *get_current_tty(void); | 337 | extern struct tty_struct *get_current_tty(void); |
338 | 338 | ||
339 | extern struct mutex tty_mutex; | 339 | extern struct mutex tty_mutex; |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 885a9a958b8d..fa9dbb6b110d 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -1758,12 +1758,11 @@ static inline void flush_unauthorized_files(struct files_struct * files) | |||
1758 | } | 1758 | } |
1759 | } | 1759 | } |
1760 | file_list_unlock(); | 1760 | file_list_unlock(); |
1761 | |||
1762 | /* Reset controlling tty. */ | ||
1763 | if (drop_tty) | ||
1764 | proc_set_tty(current, NULL); | ||
1765 | } | 1761 | } |
1766 | mutex_unlock(&tty_mutex); | 1762 | mutex_unlock(&tty_mutex); |
1763 | /* Reset controlling tty. */ | ||
1764 | if (drop_tty) | ||
1765 | no_tty(); | ||
1767 | 1766 | ||
1768 | /* Revalidate access to inherited open files. */ | 1767 | /* Revalidate access to inherited open files. */ |
1769 | 1768 | ||