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 @@
+