* Steven Rostedt ([EMAIL PROTECTED]) wrote: > Where, sa_mask is _ignored_ if NODEFER is set. (I now have woken up!). > The attached program shows that the sa_mask is indeed ignored when > SA_NODEFER is set. > > Now the real question is... Is this a bug?
That's not correct w.r.t. SUSv3. sa_mask should be always used and SA_NODEFER is just whether or not to add that signal in. SA_NODEFER [XSI] If set and sig is caught, sig shall not be added to the thread's signal mask on entry to the signal handler unless it is included in sa_mask. Otherwise, sig shall always be added to the thread's signal mask on entry to the signal handler. Brodo, is this what you mean? thanks, -chris -- Subject: [PATCH] fix SA_NODEFER signals to honor sa_mask When receiving SA_NODEFER signal, kernel was inapproriately not applying the sa_mask. As pointed out by Brodo Stroesser. Signed-off-by: Chris Wright <[EMAIL PROTECTED]> --- diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c @@ -577,13 +577,12 @@ handle_signal(unsigned long sig, siginfo else ret = setup_frame(sig, ka, oldset, regs); - if (ret && !(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 (ret && !(ka->sa.sa_flags & SA_NODEFER)) sigaddset(¤t->blocked,sig); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - } + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); return ret; } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/