mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-04 02:18:37 +00:00
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
This commit is contained in:
parent
aab639348b
commit
7def6b371b
@ -764,8 +764,8 @@ typedef
|
||||
*/
|
||||
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;
|
||||
|
||||
@ -1877,6 +1877,29 @@ PRE(execve)
|
||||
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
|
||||
|
||||
@ -15,6 +15,8 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
|
||||
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 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
|
||||
|
||||
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 @@ cpuid_SOURCES = cpuid_c.c cpuid_s.s
|
||||
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
|
||||
|
||||
1
none/tests/exec-sigmask.stderr.exp
Normal file
1
none/tests/exec-sigmask.stderr.exp
Normal file
@ -0,0 +1 @@
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user