mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Fix signalfd interaction with thread-private signals
Don't let signalfd dequeue private signals off other threads (in the case of things like SIGILL or SIGSEGV, trying to do so would result in undefined behaviour on who actually gets the signal, since they are force unblocked). Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Davide Libenzi <davidel@xmailserver.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									bd197234b0
								
							
						
					
					
						commit
						caec4e8dc8
					
				
					 1 changed files with 7 additions and 1 deletions
				
			
		| 
						 | 
					@ -363,7 +363,13 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
 | 
					int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int signr = __dequeue_signal(&tsk->pending, mask, info);
 | 
						int signr = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* We only dequeue private signals from ourselves, we don't let
 | 
				
			||||||
 | 
						 * signalfd steal them
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (tsk == current)
 | 
				
			||||||
 | 
							signr = __dequeue_signal(&tsk->pending, mask, info);
 | 
				
			||||||
	if (!signr) {
 | 
						if (!signr) {
 | 
				
			||||||
		signr = __dequeue_signal(&tsk->signal->shared_pending,
 | 
							signr = __dequeue_signal(&tsk->signal->shared_pending,
 | 
				
			||||||
					 mask, info);
 | 
										 mask, info);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue