diff options
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 16 | 
1 files changed, 10 insertions, 6 deletions
| diff --git a/fs/exec.c b/fs/exec.c index 1d6243d9f2b6..7eb8d21bcab9 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1216,15 +1216,14 @@ killed:  	return -EAGAIN;  } -char *get_task_comm(char *buf, struct task_struct *tsk) +char *__get_task_comm(char *buf, size_t buf_size, struct task_struct *tsk)  { -	/* buf must be at least sizeof(tsk->comm) in size */  	task_lock(tsk); -	strncpy(buf, tsk->comm, sizeof(tsk->comm)); +	strncpy(buf, tsk->comm, buf_size);  	task_unlock(tsk);  	return buf;  } -EXPORT_SYMBOL_GPL(get_task_comm); +EXPORT_SYMBOL_GPL(__get_task_comm);  /*   * These functions flushes out all traces of the currently running executable @@ -1350,9 +1349,14 @@ void setup_new_exec(struct linux_binprm * bprm)  	current->sas_ss_sp = current->sas_ss_size = 0; -	/* Figure out dumpability. */ +	/* +	 * Figure out dumpability. Note that this checking only of current +	 * is wrong, but userspace depends on it. This should be testing +	 * bprm->secureexec instead. +	 */  	if (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP || -	    bprm->secureexec) +	    !(uid_eq(current_euid(), current_uid()) && +	      gid_eq(current_egid(), current_gid())))  		set_dumpable(current->mm, suid_dumpable);  	else  		set_dumpable(current->mm, SUID_DUMP_USER); | 

