diff options
author | Oleg Nesterov <oleg@redhat.com> | 2011-07-10 15:27:24 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2011-07-15 00:21:31 -0400 |
commit | 905f29e2aa004560907199cc96248fa11bafea8a (patch) | |
tree | 4f65e08fb63c8b1afab93443a9c450abbaec4313 | |
parent | 620917de59eeb934b9f8cf35cc2d95c1ac8ed0fc (diff) |
x86, signals: Convert the IA32_EMULATION code to use set_current_blocked()
sys32_sigsuspend() and sys32_*sigreturn() change ->blocked directly.
This is not correct, see the changelog in e6fa16ab
"signal: sigprocmask() should do retarget_shared_pending()"
Change them to use set_current_blocked().
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Link: http://lkml.kernel.org/r/20110710192724.GA31755@redhat.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | arch/x86/ia32/ia32_signal.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 588a7aa937e1..65577698cab2 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -127,15 +127,17 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | |||
127 | 127 | ||
128 | asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask) | 128 | asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask) |
129 | { | 129 | { |
130 | mask &= _BLOCKABLE; | 130 | sigset_t blocked; |
131 | spin_lock_irq(¤t->sighand->siglock); | 131 | |
132 | current->saved_sigmask = current->blocked; | 132 | current->saved_sigmask = current->blocked; |
133 | siginitset(¤t->blocked, mask); | 133 | |
134 | recalc_sigpending(); | 134 | mask &= _BLOCKABLE; |
135 | spin_unlock_irq(¤t->sighand->siglock); | 135 | siginitset(&blocked, mask); |
136 | set_current_blocked(&blocked); | ||
136 | 137 | ||
137 | current->state = TASK_INTERRUPTIBLE; | 138 | current->state = TASK_INTERRUPTIBLE; |
138 | schedule(); | 139 | schedule(); |
140 | |||
139 | set_restore_sigmask(); | 141 | set_restore_sigmask(); |
140 | return -ERESTARTNOHAND; | 142 | return -ERESTARTNOHAND; |
141 | } | 143 | } |
@@ -279,10 +281,7 @@ asmlinkage long sys32_sigreturn(struct pt_regs *regs) | |||
279 | goto badframe; | 281 | goto badframe; |
280 | 282 | ||
281 | sigdelsetmask(&set, ~_BLOCKABLE); | 283 | sigdelsetmask(&set, ~_BLOCKABLE); |
282 | spin_lock_irq(¤t->sighand->siglock); | 284 | set_current_blocked(&set); |
283 | current->blocked = set; | ||
284 | recalc_sigpending(); | ||
285 | spin_unlock_irq(¤t->sighand->siglock); | ||
286 | 285 | ||
287 | if (ia32_restore_sigcontext(regs, &frame->sc, &ax)) | 286 | if (ia32_restore_sigcontext(regs, &frame->sc, &ax)) |
288 | goto badframe; | 287 | goto badframe; |
@@ -308,10 +307,7 @@ asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs) | |||
308 | goto badframe; | 307 | goto badframe; |
309 | 308 | ||
310 | sigdelsetmask(&set, ~_BLOCKABLE); | 309 | sigdelsetmask(&set, ~_BLOCKABLE); |
311 | spin_lock_irq(¤t->sighand->siglock); | 310 | set_current_blocked(&set); |
312 | current->blocked = set; | ||
313 | recalc_sigpending(); | ||
314 | spin_unlock_irq(¤t->sighand->siglock); | ||
315 | 311 | ||
316 | if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 312 | if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) |
317 | goto badframe; | 313 | goto badframe; |