diff --git a/defs.h b/defs.h index ef4ac475..d2c905a6 100644 --- a/defs.h +++ b/defs.h @@ -505,6 +505,7 @@ extern struct tcb **tcbtab; extern int *qual_flags; extern int debug, followfork; extern unsigned int ptrace_setoptions_followfork; +extern unsigned int ptrace_setoptions_for_all; extern int dtime, xflag, qflag; extern cflag_t cflag; extern int acolumn; diff --git a/process.c b/process.c index 36ac5ab8..9a767d3e 100644 --- a/process.c +++ b/process.c @@ -1775,8 +1775,7 @@ struct tcb *tcp; #endif int -internal_exec(tcp) -struct tcb *tcp; +internal_exec(struct tcb *tcp) { #ifdef SUNOS4 if (exiting(tcp) && !syserror(tcp) && followfork) @@ -1785,8 +1784,11 @@ struct tcb *tcp; #if defined LINUX && defined TCB_WAITEXECVE if (exiting(tcp) && syserror(tcp)) tcp->flags &= ~TCB_WAITEXECVE; - else - tcp->flags |= TCB_WAITEXECVE; + else { + /* Maybe we have post-execve SIGTRAP suppressed? */ + if (!(ptrace_setoptions_for_all & PTRACE_O_TRACEEXEC)) + tcp->flags |= TCB_WAITEXECVE; /* no */ + } #endif /* LINUX && TCB_WAITEXECVE */ return 0; } diff --git a/strace.c b/strace.c index 47280548..61176b67 100644 --- a/strace.c +++ b/strace.c @@ -85,7 +85,7 @@ extern char *optarg; int debug = 0, followfork = 0; unsigned int ptrace_setoptions_followfork = 0; -static unsigned int ptrace_setoptions_for_all = 0; +unsigned int ptrace_setoptions_for_all = 0; /* Which WSTOPSIG(status) value marks syscall traps? */ static unsigned int SYSCALLTRAP = SIGTRAP; int dtime = 0, xflag = 0, qflag = 0;