We do _not_ want to block anything on failure to set sigframe up and we do not want to ignore sa_mask even when SA_NODOFER is set. Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> --- arch/avr32/kernel/signal.c | 26 +++++++++++--------------- 1 files changed, 11 insertions(+), 15 deletions(-) diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c index 8c481fb..52affae 100644 --- a/arch/avr32/kernel/signal.c +++ b/arch/avr32/kernel/signal.c @@ -231,28 +231,24 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, /* * Set up the stack frame */ - ret = setup_rt_frame(sig, ka, info, oldset, regs); + if (setup_rt_frame(sig, ka, info, oldset, regs) != 0) + goto fail; /* * Check that the resulting registers are sane */ - ret |= !valid_user_regs(regs); + if (!valid_user_regs(regs)) + goto fail; - /* - * Block the signal if we were unsuccessful. - */ - if (ret != 0 || !(ka->sa.sa_flags & SA_NODEFER)) { - spin_lock_irq(¤t->sighand->siglock); - sigorsets(¤t->blocked, ¤t->blocked, - &ka->sa.sa_mask); + spin_lock_irq(¤t->sighand->siglock); + sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); + if (!(ka->sa.sa_flags & SA_NODEFER)) sigaddset(¤t->blocked, sig); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - } - - if (ret == 0) - return; + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + return; +fail: force_sigsegv(sig, current); } -- 1.5.6.5 -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html