diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 20 | 
1 files changed, 10 insertions, 10 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index e58a6c619824..284fc1600063 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1510,15 +1510,15 @@ int kill_pid_usb_asyncio(int sig, int errno, sigval_t addr,  	unsigned long flags;  	int ret = -EINVAL; +	if (!valid_signal(sig)) +		return ret; +  	clear_siginfo(&info);  	info.si_signo = sig;  	info.si_errno = errno;  	info.si_code = SI_ASYNCIO;  	*((sigval_t *)&info.si_pid) = addr; -	if (!valid_signal(sig)) -		return ret; -  	rcu_read_lock();  	p = pid_task(pid, PIDTYPE_PID);  	if (!p) { @@ -1557,12 +1557,8 @@ static int kill_something_info(int sig, struct kernel_siginfo *info, pid_t pid)  {  	int ret; -	if (pid > 0) { -		rcu_read_lock(); -		ret = kill_pid_info(sig, info, find_vpid(pid)); -		rcu_read_unlock(); -		return ret; -	} +	if (pid > 0) +		return kill_proc_info(sig, info, pid);  	/* -INT_MIN is undefined.  Exclude this case to avoid a UBSAN warning */  	if (pid == INT_MIN) @@ -1993,8 +1989,12 @@ bool do_notify_parent(struct task_struct *tsk, int sig)  		if (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN)  			sig = 0;  	} +	/* +	 * Send with __send_signal as si_pid and si_uid are in the +	 * parent's namespaces. +	 */  	if (valid_signal(sig) && sig) -		__group_send_sig_info(sig, &info, tsk->parent); +		__send_signal(sig, &info, tsk->parent, PIDTYPE_TGID, false);  	__wake_up_parent(tsk, tsk->parent);  	spin_unlock_irqrestore(&psig->siglock, flags);  | 
