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>

authored by Benjamin Herrenschmidt and committed by Linus Torvalds caec4e8d bd197234

+7 -1
+7 -1
kernel/signal.c
··· 363 */ 364 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) 365 { 366 - int signr = __dequeue_signal(&tsk->pending, mask, info); 367 if (!signr) { 368 signr = __dequeue_signal(&tsk->signal->shared_pending, 369 mask, info);
··· 363 */ 364 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) 365 { 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); 373 if (!signr) { 374 signr = __dequeue_signal(&tsk->signal->shared_pending, 375 mask, info);