From: Stephen Smalley This patch changes the SELinux flush_unauthorized_files function to also recheck access to the controlling tty and reset it if it is no longer accessible under the new security context. This patch is relative to the selinuxfs devnull patch. Signed-off-by: Stephen Smalley Signed-off-by: James Morris Signed-off-by: Andrew Morton --- 25-akpm/security/selinux/hooks.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+) diff -puN security/selinux/hooks.c~selinux-revalidate-access-to-controlling-tty security/selinux/hooks.c --- 25/security/selinux/hooks.c~selinux-revalidate-access-to-controlling-tty 2004-08-16 11:46:55.771807136 -0700 +++ 25-akpm/security/selinux/hooks.c 2004-08-16 11:46:55.777806224 -0700 @@ -43,6 +43,7 @@ #include #include #include +#include #include #include /* for sysctl_local_port_range[] */ #include /* struct or_callable used in sock_rcv_skb */ @@ -1733,8 +1734,32 @@ static inline void flush_unauthorized_fi { struct avc_audit_data ad; struct file *file, *devnull = NULL; + struct tty_struct *tty = current->signal->tty; long j = -1; + if (tty) { + file_list_lock(); + file = list_entry(tty->tty_files.next, typeof(*file), f_list); + if (file) { + /* Revalidate access to controlling tty. + Use inode_has_perm on the tty inode directly rather + than using file_has_perm, as this particular open + file may belong to another process and we are only + interested in the inode-based check here. */ + struct inode *inode = file->f_dentry->d_inode; + if (inode_has_perm(current, inode, + FILE__READ | FILE__WRITE, + NULL, NULL)) { + /* Reset controlling tty. */ + current->signal->tty = NULL; + current->signal->tty_old_pgrp = 0; + } + } + file_list_unlock(); + } + + /* Revalidate access to inherited open files. */ + AVC_AUDIT_DATA_INIT(&ad,FS); spin_lock(&files->file_lock); _