summaryrefslogtreecommitdiffstats
path: root/arch/avr32/kernel/signal.c
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-05-11 10:57:57 +1000
committerAl Viro <viro@zeniv.linux.org.uk>2012-05-21 23:52:36 -0400
commite1b1fd79a04396d5ec971e9e4d4711b5a58ad7e3 (patch)
tree24e80e0321f62439950fb11357f44cf46eafc4e8 /arch/avr32/kernel/signal.c
parent3883e301bf05457d09ffc16c03ead6182ac3d732 (diff)
downloadlinux-e1b1fd79a04396d5ec971e9e4d4711b5a58ad7e3.tar.gz
linux-e1b1fd79a04396d5ec971e9e4d4711b5a58ad7e3.tar.xz
avr32: don't mask signals in the error path
The current handle_signal() implementation is broken - it will mask signals if we fail to setup the signal stack frame, which isn't the desired behaviour, we should only be masking signals if we succeed in setting up the stack frame. It looks like this code was copied from the old (broken) arm implementation but wasn't updated when the arm code was fixed in commit a6c61e9dfdd0 ("[ARM] 3168/1: Update ARM signal delivery and masking"). Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no> Acked-by: Havard Skinnemoen <hskinnemoen@gmail.com> Acked-by: Oleg Nesterov <oleg@redhat.com> 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/avr32/kernel/signal.c')
-rw-r--r--arch/avr32/kernel/signal.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c
index 64f886fac2ef..9c075e105d60 100644
--- a/arch/avr32/kernel/signal.c
+++ b/arch/avr32/kernel/signal.c
@@ -238,22 +238,21 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
*/
ret |= !valid_user_regs(regs);
+ if (ret != 0) {
+ force_sigsegv(sig, current);
+ return;
+ }
+
/*
- * Block the signal if we were unsuccessful.
+ * Block the signal if we were successful.
*/
- if (ret != 0 || !(ka->sa.sa_flags & SA_NODEFER)) {
- spin_lock_irq(&current->sighand->siglock);
- sigorsets(&current->blocked, &current->blocked,
- &ka->sa.sa_mask);
+ spin_lock_irq(&current->sighand->siglock);
+ sigorsets(&current->blocked, &current->blocked,
+ &ka->sa.sa_mask);
+ if (!(ka->sa.sa_flags & SA_NODEFER))
sigaddset(&current->blocked, sig);
- recalc_sigpending();
- spin_unlock_irq(&current->sighand->siglock);
- }
-
- if (ret == 0)
- return;
-
- force_sigsegv(sig, current);
+ recalc_sigpending();
+ spin_unlock_irq(&current->sighand->siglock);
}
/*