From f8bc0655a0db6fd3031384a88cdc707285029ca5 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 24 May 2011 20:30:24 +0200 Subject: [PATCH] Don't perform TCB_WAITEXECVE wait if not needed. * defs.h (ptrace_setoptions_for_all): Expose this variable. * strace.c (ptrace_setoptions_for_all): Remove "static". * process.c (internal_exec): Don't set TCB_WAITEXECVE bit if we know that post-execve SIGTRAP is not going to happen. --- defs.h | 1 + process.c | 10 ++++++---- strace.c | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) 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; -- 2.40.0