Fix small bug causing assertion failure in computation of SKSS.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@316 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_signals.c b/coregrind/vg_signals.c
index 1b4c981..6532b28 100644
--- a/coregrind/vg_signals.c
+++ b/coregrind/vg_signals.c
@@ -312,7 +312,11 @@
&& sig != VKI_SIGKILL && sig != VKI_SIGSTOP)
VG_(ksigaddset)( &dst->skss_sigmask, sig );
- dst->skss_per_sig[sig].skss_handler = skss_handler;
+ if (sig != VKI_SIGKILL && sig != VKI_SIGSTOP)
+ dst->skss_per_sig[sig].skss_handler = skss_handler;
+ else
+ dst->skss_per_sig[sig].skss_handler = VKI_SIG_DFL;
+
dst->skss_per_sig[sig].skss_flags = skss_flags;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 14e6f25..21a8d20 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -29,4 +29,4 @@
pth_threadpool.c pth_specific.c pth_mutexspeed.c malloc3.c \
pth_once.c weirdioctl.c pth_signal1.c pth_signal2.c \
discard.c pth_semaphore1.c new_override.cpp pth_yield.c \
- sigaltstack.c erringfds.c
+ sigaltstack.c erringfds.c sigwait_all.c
diff --git a/tests/sigwait_all.c b/tests/sigwait_all.c
new file mode 100644
index 0000000..27a5be7
--- /dev/null
+++ b/tests/sigwait_all.c
@@ -0,0 +1,23 @@
+
+#include <stdio.h>
+#include <pthread.h>
+#include <signal.h>
+
+
+int main ( void )
+{
+ int res, sig;
+ sigset_t set;
+ sigfillset(&set);
+
+ /* block all signals */
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
+
+ printf("send me a signal, any signal\n");
+
+ /* Wait for any signal in the set */
+ res = sigwait(&set, &sig);
+
+ printf("sigwait returned, res = %d, sig = %d\n", res, sig);
+ return 0;
+}
diff --git a/vg_signals.c b/vg_signals.c
index 1b4c981..6532b28 100644
--- a/vg_signals.c
+++ b/vg_signals.c
@@ -312,7 +312,11 @@
&& sig != VKI_SIGKILL && sig != VKI_SIGSTOP)
VG_(ksigaddset)( &dst->skss_sigmask, sig );
- dst->skss_per_sig[sig].skss_handler = skss_handler;
+ if (sig != VKI_SIGKILL && sig != VKI_SIGSTOP)
+ dst->skss_per_sig[sig].skss_handler = skss_handler;
+ else
+ dst->skss_per_sig[sig].skss_handler = VKI_SIG_DFL;
+
dst->skss_per_sig[sig].skss_flags = skss_flags;
}