Fix bug 72484.  Set the process signal mask to match the client's before
running exec.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2198 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_include.h b/coregrind/vg_include.h
index 4bfa764..8681485 100644
--- a/coregrind/vg_include.h
+++ b/coregrind/vg_include.h
@@ -764,8 +764,8 @@
    */
    vki_ksigset_t sig_mask;
 
-   /* Effective signal mask.  This is the mask which is currently
-      applying; it may be different from sig_mask while a signal
+   /* Effective signal mask.  This is the mask which currently
+      applies; it may be different from sig_mask while a signal
       handler is running.
     */
    vki_ksigset_t eff_sig_mask;
diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c
index d123eec..1e4fe25 100644
--- a/coregrind/vg_syscalls.c
+++ b/coregrind/vg_syscalls.c
@@ -1877,6 +1877,29 @@
 	 VG_(printf)("env: %s\n", *cpp);
    }
 
+   /* Set our real sigmask to match the client's sigmask so that the
+      exec'd child will get the right mask.  First we need to clear
+      out any pending signals so they they don't get delivered, which
+      would confuse things.
+
+      XXX This is a bug - the signals should remain pending, and be
+      delivered to the new process after exec.  There's also a
+      race-condition, since if someone delivers us a signal between
+      the sigprocmask and the execve, we'll still get the signal. Oh
+      well.
+   */
+   {
+      vki_ksigset_t allsigs;
+      vki_ksiginfo_t info;
+      static const struct vki_timespec zero = { 0, 0 };
+    
+      VG_(ksigfillset)(&allsigs);
+      while(VG_(ksigtimedwait)(&allsigs, &info, &zero) > 0)
+	 ;
+
+      VG_(ksigprocmask)(VKI_SIG_SETMASK, &tst->sig_mask, NULL);
+   }
+
    res = VG_(do_syscall)(__NR_execve, arg1, arg2, arg3);
 
    /* If we got here, then the execve failed.  We've already made too much of a mess
diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am
index e75d284..0dd6e89 100644
--- a/none/tests/Makefile.am
+++ b/none/tests/Makefile.am
@@ -15,6 +15,8 @@
 	dastest.vgtest \
 	discard.stderr.exp discard.stdout.exp \
 	discard.vgtest \
+	exec-sigmask.vgtest 
+	exec-sigmask.stdout.exp exec-sigmask.stderr.exp \
 	floored.stderr.exp floored.stdout.exp \
 	floored.vgtest \
 	fork.stderr.exp fork.stdout.exp fork.vgtest \
@@ -44,7 +46,7 @@
 
 check_PROGRAMS = \
 	args bitfield1 bt_everything bt_literal coolo_strlen \
-	cpuid dastest discard floored fork fpu_lazy_eflags \
+	cpuid dastest discard exec-sigmask floored fork fpu_lazy_eflags \
 	fucomip munmap_exe map_unmap mremap rcl_assert \
 	rcrl readline1 resolv seg_override sha1_test shortpush shorts smc1 \
 	pth_blockedsig \
@@ -63,6 +65,7 @@
 coolo_strlen_SOURCES 	= coolo_strlen.c
 dastest_SOURCES 	= dastest_c.c dastest_s.s
 discard_SOURCES 	= discard.c
+exec_sigmask_SOURCES	= exec-sigmask.c
 fork_SOURCES 		= fork.c
 floored_SOURCES 	= floored.c
 floored_LDADD 		= -lm
diff --git a/none/tests/exec-sigmask.stderr.exp b/none/tests/exec-sigmask.stderr.exp
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/none/tests/exec-sigmask.stderr.exp
@@ -0,0 +1 @@
+