sigwait eats blocked default-ignore signals
While a signal is blocked, it must be posted even if its action is SIG_IGN or is SIG_DFL with the default action to ignore. This works right most of the time, but is broken when a sigwait (rt_sigtimedwait) is in progress. This changes the early-discard check to respect real_blocked. ~blocked is the set to check for "should wake up now", but ~(blocked|real_blocked) is the set for "blocked" semantics as defined by POSIX. This fixes bugzilla entry 9347, see http://bugzilla.kernel.org/show_bug.cgi?id=9347 Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6fa02839bf
commit
325d22df7b
|
@ -55,7 +55,7 @@ static int sig_ignored(struct task_struct *t, int sig)
|
|||
* signal handler may change by the time it is
|
||||
* unblocked.
|
||||
*/
|
||||
if (sigismember(&t->blocked, sig))
|
||||
if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
|
||||
return 0;
|
||||
|
||||
/* Is it explicitly or implicitly ignored? */
|
||||
|
|
Loading…
Reference in New Issue