diff options
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 33 | 
1 files changed, 17 insertions, 16 deletions
diff --git a/fs/exec.c b/fs/exec.c index aeb135c7ff5c..92ce83a11e90 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1071,6 +1071,21 @@ void set_task_comm(struct task_struct *tsk, char *buf)  	perf_event_comm(tsk);  } +static void filename_to_taskname(char *tcomm, const char *fn, unsigned int len) +{ +	int i, ch; + +	/* Copies the binary name from after last slash */ +	for (i = 0; (ch = *(fn++)) != '\0';) { +		if (ch == '/') +			i = 0; /* overwrite what we wrote */ +		else +			if (i < len - 1) +				tcomm[i++] = ch; +	} +	tcomm[i] = '\0'; +} +  int flush_old_exec(struct linux_binprm * bprm)  {  	int retval; @@ -1085,6 +1100,7 @@ int flush_old_exec(struct linux_binprm * bprm)  	set_mm_exe_file(bprm->mm, bprm->file); +	filename_to_taskname(bprm->tcomm, bprm->filename, sizeof(bprm->tcomm));  	/*  	 * Release all of the old mmap stuff  	 */ @@ -1116,10 +1132,6 @@ EXPORT_SYMBOL(would_dump);  void setup_new_exec(struct linux_binprm * bprm)  { -	int i, ch; -	const char *name; -	char tcomm[sizeof(current->comm)]; -  	arch_pick_mmap_layout(current->mm);  	/* This is the point of no return */ @@ -1130,18 +1142,7 @@ void setup_new_exec(struct linux_binprm * bprm)  	else  		set_dumpable(current->mm, suid_dumpable); -	name = bprm->filename; - -	/* Copies the binary name from after last slash */ -	for (i=0; (ch = *(name++)) != '\0';) { -		if (ch == '/') -			i = 0; /* overwrite what we wrote */ -		else -			if (i < (sizeof(tcomm) - 1)) -				tcomm[i++] = ch; -	} -	tcomm[i] = '\0'; -	set_task_comm(current, tcomm); +	set_task_comm(current, bprm->tcomm);  	/* Set the new mm task size. We have to do that late because it may  	 * depend on TIF_32BIT which is only updated in flush_thread() on  | 
