summaryrefslogtreecommitdiff
path: root/fs/signalfd.c
diff options
context:
space:
mode:
authorDavide Libenzi <davidel@xmailserver.org>2007-06-28 01:09:59 +0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-06-28 22:34:54 +0400
commitf8738c5c5298d55ccfc26383f9f45af082a9be57 (patch)
treebaa7c6f2a31dcc4c4d2875f73b1462be5fbb388d /fs/signalfd.c
parent58e78475ec706f93e0cc049449ffd11fbfdadb3e (diff)
downloadlinux-f8738c5c5298d55ccfc26383f9f45af082a9be57.tar.xz
avoid spurious POLLIN returns in signalfd
The new code in kernel/signal.c does not allow fetching private signals from another task. This patch avoid spurious POLLIN returns from a signalfd poll(2) operation. Signed-off-by: Davide Libenzi <davidel@xmailserver.org> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/signalfd.c')
-rw-r--r--fs/signalfd.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/signalfd.c b/fs/signalfd.c
index f1da89203a9a..3b07f26d984d 100644
--- a/fs/signalfd.c
+++ b/fs/signalfd.c
@@ -133,7 +133,8 @@ static unsigned int signalfd_poll(struct file *file, poll_table *wait)
* the peer disconnects.
*/
if (signalfd_lock(ctx, &lk)) {
- if (next_signal(&lk.tsk->pending, &ctx->sigmask) > 0 ||
+ if ((lk.tsk == current &&
+ next_signal(&lk.tsk->pending, &ctx->sigmask) > 0) ||
next_signal(&lk.tsk->signal->shared_pending,
&ctx->sigmask) > 0)
events |= POLLIN;