Messages in this thread | | | Date | Wed, 3 Aug 2011 15:08:13 +0200 | From | Oleg Nesterov <> | Subject | Re: avr32: handle_signal() bug? |
| |
On 08/03, Matt Fleming wrote: > > * 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); > sigaddset(¤t->blocked, sig); > recalc_sigpending(); > spin_unlock_irq(¤t->sighand->siglock); > }
Agreed, this looks "obviously wrong". We should block the !SA_NODEFER signal it was delivered.
> Is there some intricacy of the avr32 architecture that I'm missing here?
same question here ;)
> --- 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(¤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; > - > - force_sigsegv(sig, current); > + recalc_sigpending(); > + spin_unlock_irq(¤t->sighand->siglock); > }
I think this is correct.
Oleg.
| |