diff options
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 17 | 
1 files changed, 10 insertions, 7 deletions
| diff --git a/fs/exec.c b/fs/exec.c index 537d92c41105..3c3c366a9bcf 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1045,7 +1045,7 @@ static int de_thread(struct task_struct *tsk)  	 * Kill all other threads in the thread group.  	 */  	spin_lock_irq(lock); -	if (signal_group_exit(sig)) { +	if ((sig->flags & SIGNAL_GROUP_EXIT) || sig->group_exec_task) {  		/*  		 * Another group action in progress, just  		 * return so that the signal is processed. @@ -1054,7 +1054,7 @@ static int de_thread(struct task_struct *tsk)  		return -EAGAIN;  	} -	sig->group_exit_task = tsk; +	sig->group_exec_task = tsk;  	sig->notify_count = zap_other_threads(tsk);  	if (!thread_group_leader(tsk))  		sig->notify_count--; @@ -1082,7 +1082,7 @@ static int de_thread(struct task_struct *tsk)  			write_lock_irq(&tasklist_lock);  			/*  			 * Do this under tasklist_lock to ensure that -			 * exit_notify() can't miss ->group_exit_task +			 * exit_notify() can't miss ->group_exec_task  			 */  			sig->notify_count = -1;  			if (likely(leader->exit_state)) @@ -1149,7 +1149,7 @@ static int de_thread(struct task_struct *tsk)  		release_task(leader);  	} -	sig->group_exit_task = NULL; +	sig->group_exec_task = NULL;  	sig->notify_count = 0;  no_thread_group: @@ -1162,7 +1162,7 @@ no_thread_group:  killed:  	/* protects against exit_notify() and __exit_signal() */  	read_lock(&tasklist_lock); -	sig->group_exit_task = NULL; +	sig->group_exec_task = NULL;  	sig->notify_count = 0;  	read_unlock(&tasklist_lock);  	return -EAGAIN; @@ -1207,7 +1207,8 @@ static int unshare_sighand(struct task_struct *me)  char *__get_task_comm(char *buf, size_t buf_size, struct task_struct *tsk)  {  	task_lock(tsk); -	strncpy(buf, tsk->comm, buf_size); +	/* Always NUL terminated and zero-padded */ +	strscpy_pad(buf, tsk->comm, buf_size);  	task_unlock(tsk);  	return buf;  } @@ -1222,7 +1223,7 @@ void __set_task_comm(struct task_struct *tsk, const char *buf, bool exec)  {  	task_lock(tsk);  	trace_task_rename(tsk, buf); -	strlcpy(tsk->comm, buf, sizeof(tsk->comm)); +	strscpy_pad(tsk->comm, buf, sizeof(tsk->comm));  	task_unlock(tsk);  	perf_event_comm(tsk, exec);  } @@ -1307,6 +1308,8 @@ int begin_new_exec(struct linux_binprm * bprm)  	 */  	force_uaccess_begin(); +	if (me->flags & PF_KTHREAD) +		free_kthread_struct(me);  	me->flags &= ~(PF_RANDOMIZE | PF_FORKNOEXEC | PF_KTHREAD |  					PF_NOFREEZE | PF_NO_SETAFFINITY);  	flush_thread(); |