mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	signal: don't silently convert SI_USER signals to non-current pidfd
The current sys_pidfd_send_signal() silently turns signals with explicit
SI_USER context that are sent to non-current tasks into signals with
kernel-generated siginfo.
This is unlike do_rt_sigqueueinfo(), which returns -EPERM in this case.
If a user actually wants to send a signal with kernel-provided siginfo,
they can do that with pidfd_send_signal(pidfd, sig, NULL, 0); so allowing
this case is unnecessary.
Instead of silently replacing the siginfo, just bail out with an error;
this is consistent with other interfaces and avoids special-casing behavior
based on security checks.
Fixes: 3eb39f4793 ("signal: add pidfd_send_signal() syscall")
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Christian Brauner <christian@brauner.io>
			
			
This commit is contained in:
		
							parent
							
								
									79a3aaa7b8
								
							
						
					
					
						commit
						556a888a14
					
				
					 1 changed files with 4 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -3605,16 +3605,11 @@ SYSCALL_DEFINE4(pidfd_send_signal, int, pidfd, int, sig,
 | 
			
		|||
		if (unlikely(sig != kinfo.si_signo))
 | 
			
		||||
			goto err;
 | 
			
		||||
 | 
			
		||||
		/* Only allow sending arbitrary signals to yourself. */
 | 
			
		||||
		ret = -EPERM;
 | 
			
		||||
		if ((task_pid(current) != pid) &&
 | 
			
		||||
		    (kinfo.si_code >= 0 || kinfo.si_code == SI_TKILL)) {
 | 
			
		||||
			/* Only allow sending arbitrary signals to yourself. */
 | 
			
		||||
			ret = -EPERM;
 | 
			
		||||
			if (kinfo.si_code != SI_USER)
 | 
			
		||||
				goto err;
 | 
			
		||||
 | 
			
		||||
			/* Turn this into a regular kill signal. */
 | 
			
		||||
			prepare_kill_siginfo(sig, &kinfo);
 | 
			
		||||
		}
 | 
			
		||||
		    (kinfo.si_code >= 0 || kinfo.si_code == SI_TKILL))
 | 
			
		||||
			goto err;
 | 
			
		||||
	} else {
 | 
			
		||||
		prepare_kill_siginfo(sig, &kinfo);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue