aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mn10300
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-05-10 20:57:59 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-05-21 23:52:35 -0400
commit00f35785fae2ae8a37b3a3dc1f2dc05e8f232bef (patch)
treebb38c6dea7898fba32d5b445001869a59d184b49 /arch/mn10300
parentf3b5e822739c70663aee8584b7993afe055431c9 (diff)
mn10300: use set_current_blocked() and block_sigmask()
As described in e6fa16ab ("signal: sigprocmask() should do retarget_shared_pending()") the modification of current->blocked is incorrect as we need to check whether the signal we're about to block is pending in the shared queue. Also, use the new helper function introduced in commit 5e6292c0f28f ("signal: add block_sigmask() for adding sigmask to current->blocked") which centralises the code for updating current->blocked after successfully delivering a signal and reduces the amount of duplicate code across architectures. In the past some architectures got this code wrong, so using this helper function should stop that from happening again. Acked-by: Oleg Nesterov <oleg@redhat.com> Acked-by: David Howells <dhowells@redhat.com> Cc: Koichi Yasutake <yasutake.koichi@jp.panasonic.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Matt Fleming <matt.fleming@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/mn10300')
-rw-r--r--arch/mn10300/kernel/signal.c21
1 files changed, 4 insertions, 17 deletions
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c
index 50eb94a05826..890cf91767cc 100644
--- a/arch/mn10300/kernel/signal.c
+++ b/arch/mn10300/kernel/signal.c
@@ -164,10 +164,7 @@ asmlinkage long sys_sigreturn(void)
164 goto badframe; 164 goto badframe;
165 165
166 sigdelsetmask(&set, ~_BLOCKABLE); 166 sigdelsetmask(&set, ~_BLOCKABLE);
167 spin_lock_irq(&current->sighand->siglock); 167 set_current_blocked(&set);
168 current->blocked = set;
169 recalc_sigpending();
170 spin_unlock_irq(&current->sighand->siglock);
171 168
172 if (restore_sigcontext(current_frame(), &frame->sc, &d0)) 169 if (restore_sigcontext(current_frame(), &frame->sc, &d0))
173 goto badframe; 170 goto badframe;
@@ -195,10 +192,7 @@ asmlinkage long sys_rt_sigreturn(void)
195 goto badframe; 192 goto badframe;
196 193
197 sigdelsetmask(&set, ~_BLOCKABLE); 194 sigdelsetmask(&set, ~_BLOCKABLE);
198 spin_lock_irq(&current->sighand->siglock); 195 set_current_blocked(&set);
199 current->blocked = set;
200 recalc_sigpending();
201 spin_unlock_irq(&current->sighand->siglock);
202 196
203 if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0)) 197 if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0))
204 goto badframe; 198 goto badframe;
@@ -468,15 +462,8 @@ static int handle_signal(int sig,
468 else 462 else
469 ret = setup_frame(sig, ka, oldset, regs); 463 ret = setup_frame(sig, ka, oldset, regs);
470 464
471 if (ret == 0) { 465 if (ret == 0)
472 spin_lock_irq(&current->sighand->siglock); 466 block_sigmask(ka, sig);
473 sigorsets(&current->blocked, &current->blocked,
474 &ka->sa.sa_mask);
475 if (!(ka->sa.sa_flags & SA_NODEFER))
476 sigaddset(&current->blocked, sig);
477 recalc_sigpending();
478 spin_unlock_irq(&current->sighand->siglock);
479 }
480 467
481 return ret; 468 return ret;
482} 469}