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).
Showing the changes to kernel (1 of 1 file). Show all
Unified · Split
| @@ -363,7 +363,13 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, · 362 unmodified lines | ||
| 363 | 363 | */ |
| 364 | 364 | int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) |
| 365 | 365 | { |
| 366 | − int signr = __dequeue_signal(&tsk->pending, mask, info); | |
| 366 | + int signr = 0; | |
| 367 | + | |
| 368 | + /* We only dequeue private signals from ourselves, we don't let | |
| 369 | + * signalfd steal them | |
| 370 | + */ | |
| 371 | + if (tsk == current) | |
| 372 | + signr = __dequeue_signal(&tsk->pending, mask, info); | |
| 367 | 373 | if (!signr) { |
| 368 | 374 | signr = __dequeue_signal(&tsk->signal->shared_pending, |
| 369 | 375 | mask, info); |