diff options
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 33 | 
1 files changed, 18 insertions, 15 deletions
| diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 44e9cd47054..65fb5e8ea94 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -1120,8 +1120,8 @@ static int file_has_perm(struct task_struct *tsk,  {  	struct task_security_struct *tsec = tsk->security;  	struct file_security_struct *fsec = file->f_security; -	struct vfsmount *mnt = file->f_vfsmnt; -	struct dentry *dentry = file->f_dentry; +	struct vfsmount *mnt = file->f_path.mnt; +	struct dentry *dentry = file->f_path.dentry;  	struct inode *inode = dentry->d_inode;  	struct avc_audit_data ad;  	int rc; @@ -1581,7 +1581,7 @@ static int selinux_bprm_alloc_security(struct linux_binprm *bprm)  static int selinux_bprm_set_security(struct linux_binprm *bprm)  {  	struct task_security_struct *tsec; -	struct inode *inode = bprm->file->f_dentry->d_inode; +	struct inode *inode = bprm->file->f_path.dentry->d_inode;  	struct inode_security_struct *isec;  	struct bprm_security_struct *bsec;  	u32 newsid; @@ -1621,10 +1621,10 @@ static int selinux_bprm_set_security(struct linux_binprm *bprm)  	}  	AVC_AUDIT_DATA_INIT(&ad, FS); -	ad.u.fs.mnt = bprm->file->f_vfsmnt; -	ad.u.fs.dentry = bprm->file->f_dentry; +	ad.u.fs.mnt = bprm->file->f_path.mnt; +	ad.u.fs.dentry = bprm->file->f_path.dentry; -	if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID) +	if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)  		newsid = tsec->sid;          if (tsec->sid == newsid) { @@ -1695,9 +1695,10 @@ static inline void flush_unauthorized_files(struct files_struct * files)  	struct tty_struct *tty;  	struct fdtable *fdt;  	long j = -1; +	int drop_tty = 0;  	mutex_lock(&tty_mutex); -	tty = current->signal->tty; +	tty = get_current_tty();  	if (tty) {  		file_list_lock();  		file = list_entry(tty->tty_files.next, typeof(*file), f_u.fu_list); @@ -1707,15 +1708,17 @@ static inline void flush_unauthorized_files(struct files_struct * files)  			   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; +			struct inode *inode = file->f_path.dentry->d_inode;  			if (inode_has_perm(current, inode,  					   FILE__READ | FILE__WRITE, NULL)) { -				/* Reset controlling tty. */ -				current->signal->tty = NULL; -				current->signal->tty_old_pgrp = 0; +				drop_tty = 1;  			}  		}  		file_list_unlock(); + +		/* Reset controlling tty. */ +		if (drop_tty) +			proc_set_tty(current, NULL);  	}  	mutex_unlock(&tty_mutex); @@ -1731,7 +1734,7 @@ static inline void flush_unauthorized_files(struct files_struct * files)  		j++;  		i = j * __NFDBITS;  		fdt = files_fdtable(files); -		if (i >= fdt->max_fds || i >= fdt->max_fdset) +		if (i >= fdt->max_fds)  			break;  		set = fdt->open_fds->fds_bits[j];  		if (!set) @@ -2417,7 +2420,7 @@ static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t  static int selinux_file_permission(struct file *file, int mask)  {  	int rc; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file->f_path.dentry->d_inode;  	if (!mask) {  		/* No permission to check.  Existence test. */ @@ -2594,7 +2597,7 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd,  	switch (cmd) {  	        case F_SETFL: -			if (!file->f_dentry || !file->f_dentry->d_inode) { +			if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {  				err = -EINVAL;  				break;  			} @@ -2620,7 +2623,7 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd,  		case F_SETLK64:  	        case F_SETLKW64:  #endif -			if (!file->f_dentry || !file->f_dentry->d_inode) { +			if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {  				err = -EINVAL;  				break;  			} | 
