History

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).

Benjamin Herrenschmidt committed 19 years ago

Commit caec4e81 parent bd197231 file · +7 −1Browse files

Showing the changes to kernel (1 of 1 file). Show all

Unified · Split

kernel/signal.c+7−1
@@ -363,7 +363,13 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, · 362 unmodified lines
363363 */
364364 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
365365 {
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);
367373 if (!signr) {
368374 signr = __dequeue_signal(&tsk->signal->shared_pending,
369375 mask, info);