aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2007-06-11 18:16:18 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-06-18 13:18:32 -0400
commitcaec4e8dc85e0644ec24aeb36285e1ba02da58cc (patch)
treec40510afdc1676f268d14ecb8bfe2ab887cf0b0f /kernel/signal.c
parentbd197234b0a616c8f04f6b682326a5a24b33ca92 (diff)
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>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index fe590e00db8d..f9405609774e 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -363,7 +363,13 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
363 */ 363 */
364int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) 364int 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 if (!signr) { 373 if (!signr) {
368 signr = __dequeue_signal(&tsk->signal->shared_pending, 374 signr = __dequeue_signal(&tsk->signal->shared_pending,
369 mask, info); 375 mask, info);