summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--hurd/hurdsig.c15
2 files changed, 15 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index e7c8890dba..e98129ec8d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-07-26 Mark Kettenis <kettenis@gnu.org>
+
+ * hurd/hurdsig.c (_hurd_internal_post_signal): Fix handling of
+ SA_RESETHAND and SA_NODEFER.
+
2001-07-27 Ulrich Drepper <drepper@redhat.com>
* libio/fileops.c (_IO_new_file_fopen): Correctly locate ccs=
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index d95958a323..748d8406c1 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -926,14 +926,19 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
/* Backdoor extra argument to signal handler. */
scp->sc_error = detail->error;
+ /* Block requested signals while running the handler. */
scp->sc_mask = ss->blocked;
+ ss->blocked |= ss->actions[signo].sa_mask;
- if ((ss->actions[signo].sa_flags & SA_NODEFER) == 0)
- /* Block SIGNO and requested signals while running the handler. */
- ss->blocked |= __sigmask (signo) | ss->actions[signo].sa_mask;
+ /* Also block SIGNO unless we're asked not to. */
+ if (! (ss->actions[signo].sa_flags & (SA_RESETHAND | SA_NODEFER)))
+ ss->blocked |= __sigmask (signo);
- if (ss->actions[signo].sa_flags & SA_RESETHAND)
- /* Silly SysV/Linux compatibility option. */
+ /* Reset to SIG_DFL if requested. SIGILL and SIGTRAP cannot
+ be automatically reset when delivered; the system silently
+ enforces this restriction. */
+ if (ss->actions[signo].sa_flags & SA_RESETHAND
+ && signo != SIGILL && signo != SIGTRAP)
ss->actions[signo].sa_handler = SIG_DFL;
/* Start the thread running the handler (or possibly waiting for an