about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/sigaction.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-06 20:49:22 +0000
committerRoland McGrath <roland@gnu.org>1996-06-06 20:49:22 +0000
commit4d02a5b18a0c2702bfca949bc60187f53d6f39d2 (patch)
treec01194451c8f80184947b404186f744bb84fa9df /sysdeps/mach/hurd/sigaction.c
parente60062b76983ec534a6cb2ca77c664e3bc1e29e7 (diff)
downloadglibc-4d02a5b18a0c2702bfca949bc60187f53d6f39d2.tar.gz
glibc-4d02a5b18a0c2702bfca949bc60187f53d6f39d2.tar.xz
glibc-4d02a5b18a0c2702bfca949bc60187f53d6f39d2.zip
Thu Jun 6 16:12:39 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
	* hurd/hurdsig.c (_hurd_internal_post_signal): For SIGNO==0 pending
	check, deliver a pending blocked signal if its action might be to
	ignore.
	* sysdeps/mach/hurd/sigaction.c: If new action is SIG_IGN or SIG_DFL
	and SIG is pending, wake up signal thread to check us.

	* hurd/hurdsig.c (_hurd_internal_post_signal): Don't mark a signal
	pending while blocked or stopped when the action is to ignore it.

	* hurd/hurdsig.c (_hurd_internal_post_signal: resume): Only set
	SS_SUSPENDED when the thread is really suspended.

	* elf/rtld.c (dl_main): Don't dereference _dl_rtld_map.l_next if null.
Diffstat (limited to 'sysdeps/mach/hurd/sigaction.c')
-rw-r--r--sysdeps/mach/hurd/sigaction.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sysdeps/mach/hurd/sigaction.c b/sysdeps/mach/hurd/sigaction.c
index ebe70664be..df28131281 100644
--- a/sysdeps/mach/hurd/sigaction.c
+++ b/sysdeps/mach/hurd/sigaction.c
@@ -67,6 +67,14 @@ DEFUN(__sigaction, (sig, act, oact),
       __spin_lock (&ss->lock);
       pending = ss->pending & ~ss->blocked;
     }
+  else if (a.sa_handler == SIG_IGN || a.sa_handler == SIG_DFL)
+    /* We are changing to an action that might be to ignore SIG signals.
+       If SIG is blocked and pending and the new action is to ignore it, we
+       must remove it from the pending set now; if the action is changed
+       back and then SIG is unblocked, the signal pending now should not
+       arrive.  So wake up the signal thread to check the new state and do
+       the right thing.  */
+    pending = ss->pending & __sigmask (sig);
   else
     pending = 0;