diff options
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/exec.c b/fs/exec.c index 1e8efdc8041..52c9e2ff6e6 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1139,7 +1139,7 @@ void setup_new_exec(struct linux_binprm * bprm)  	/* This is the point of no return */  	current->sas_ss_sp = current->sas_ss_size = 0; -	if (current_euid() == current_uid() && current_egid() == current_gid()) +	if (uid_eq(current_euid(), current_uid()) && gid_eq(current_egid(), current_gid()))  		set_dumpable(current->mm, 1);  	else  		set_dumpable(current->mm, suid_dumpable); @@ -1153,8 +1153,8 @@ void setup_new_exec(struct linux_binprm * bprm)  	current->mm->task_size = TASK_SIZE;  	/* install the new credentials */ -	if (bprm->cred->uid != current_euid() || -	    bprm->cred->gid != current_egid()) { +	if (!uid_eq(bprm->cred->uid, current_euid()) || +	    !gid_eq(bprm->cred->gid, current_egid())) {  		current->pdeath_signal = 0;  	} else {  		would_dump(bprm, bprm->file); @@ -1299,8 +1299,11 @@ int prepare_binprm(struct linux_binprm *bprm)  	    !current->no_new_privs) {  		/* Set-uid? */  		if (mode & S_ISUID) { +			if (!kuid_has_mapping(bprm->cred->user_ns, inode->i_uid)) +				return -EPERM;  			bprm->per_clear |= PER_CLEAR_ON_SETID;  			bprm->cred->euid = inode->i_uid; +  		}  		/* Set-gid? */ @@ -1310,6 +1313,8 @@ int prepare_binprm(struct linux_binprm *bprm)  		 * executable.  		 */  		if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { +			if (!kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) +				return -EPERM;  			bprm->per_clear |= PER_CLEAR_ON_SETID;  			bprm->cred->egid = inode->i_gid;  		} @@ -2142,7 +2147,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)  	if (__get_dumpable(cprm.mm_flags) == 2) {  		/* Setuid core dump mode */  		flag = O_EXCL;		/* Stop rewrite attacks */ -		cred->fsuid = 0;	/* Dump root private */ +		cred->fsuid = GLOBAL_ROOT_UID;	/* Dump root private */  	}  	retval = coredump_wait(exit_code, &core_state); @@ -2243,7 +2248,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)  		 * Dont allow local users get cute and trick others to coredump  		 * into their pre-created files.  		 */ -		if (inode->i_uid != current_fsuid()) +		if (!uid_eq(inode->i_uid, current_fsuid()))  			goto close_fail;  		if (!cprm.file->f_op || !cprm.file->f_op->write)  			goto close_fail;  |