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;
    }