summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2011-04-27 21:09:39 +0200
committerOleg Nesterov <oleg@redhat.com>2011-04-28 13:01:38 +0200
commite9bd3f0faa90084f188830d77723bafe422e486b (patch)
treeec80acc87031f21f96edb3bacf8caf9b45ee4f85
parente6a585801b451443480ff66914a522b482457460 (diff)
downloadlwn-e9bd3f0faa90084f188830d77723bafe422e486b.tar.gz
lwn-e9bd3f0faa90084f188830d77723bafe422e486b.zip
x86: signal: sys_rt_sigreturn() should use set_current_blocked()
Normally sys_rt_sigreturn() restores the old current->blocked which was changed by handle_signal(), and unblocking is always fine. But the debugger or application itself can change frame->uc_sigmask and thus we need set_current_blocked()->retarget_shared_pending(). Signed-off-by: Oleg Nesterov <oleg@redhat.com> Reviewed-by: Matt Fleming <matt.fleming@linux.intel.com> Acked-by: Tejun Heo <tj@kernel.org>
-rw-r--r--arch/x86/kernel/signal.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 5a8f5e68bb61..40a24932a8a1 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -601,10 +601,7 @@ long sys_rt_sigreturn(struct pt_regs *regs)
goto badframe;
sigdelsetmask(&set, ~_BLOCKABLE);
- spin_lock_irq(&current->sighand->siglock);
- current->blocked = set;
- recalc_sigpending();
- spin_unlock_irq(&current->sighand->siglock);
+ set_current_blocked(&set);
if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
goto badframe;