Remove TCB_FOLLOWFORK
TCB_FOLLOWFORK flag seems to be unnecessary, because we either follow all [v]forks/clones or don't follow any, therefore global variable followfork is an already existing indicator of what we want to do. This patch drops all setting/clearing of TCB_FOLLOWFORK bit, and replaces checks for this bit by checks of followfork value. In internal_fork, check is moved to in front of if(), since the check is needed on both "entering" and "exiting" branch. * defs.h: Remove TCB_FOLLOWFORK define. * process.c (internal_fork): Do not set/clear TCB_FOLLOWFORK, test followfork instead of tcp->flags & TCB_FOLLOWFORK. (handle_new_child): Likewise. * strace.c (startup_attach): Likewise. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
1c706b3809
commit
65d7c4d66c
1
defs.h
1
defs.h
@ -401,7 +401,6 @@ struct tcb {
|
||||
#define TCB_SUSPENDED 00040 /* Process can not be allowed to resume just now */
|
||||
#define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */
|
||||
#define TCB_SIGTRAPPED 00200 /* Process wanted to block SIGTRAP */
|
||||
#define TCB_FOLLOWFORK 00400 /* Process should have forks followed */
|
||||
#define TCB_REPRINT 01000 /* We should reprint this syscall on exit */
|
||||
#define TCB_FILTERED 02000 /* This system call has been filtered out */
|
||||
#ifdef LINUX
|
||||
|
22
process.c
22
process.c
@ -495,7 +495,6 @@ internal_fork(struct tcb *tcp)
|
||||
return 0;
|
||||
if (!followfork)
|
||||
return 0;
|
||||
tcp->flags |= TCB_FOLLOWFORK;
|
||||
if (syserror(tcp))
|
||||
return 0;
|
||||
tcpchild = alloctcb(tcp->u_rval);
|
||||
@ -796,7 +795,6 @@ handle_new_child(struct tcb *tcp, int pid, int bpt)
|
||||
else
|
||||
#endif /* CLONE_PTRACE */
|
||||
{
|
||||
tcp->flags |= TCB_FOLLOWFORK;
|
||||
tcpchild = alloctcb(pid);
|
||||
}
|
||||
|
||||
@ -891,10 +889,10 @@ internal_fork(struct tcb *tcp)
|
||||
== (PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK))
|
||||
return 0;
|
||||
|
||||
if (!followfork)
|
||||
return 0;
|
||||
|
||||
if (entering(tcp)) {
|
||||
tcp->flags &= ~TCB_FOLLOWFORK;
|
||||
if (!followfork)
|
||||
return 0;
|
||||
/*
|
||||
* In occasion of using PTRACE_O_TRACECLONE, we won't see the
|
||||
* new child if clone is called with flag CLONE_UNTRACED, so
|
||||
@ -903,15 +901,11 @@ internal_fork(struct tcb *tcp)
|
||||
if ((sysent[tcp->scno].sys_func == sys_clone) &&
|
||||
(tcp->u_arg[ARG_FLAGS] & CLONE_UNTRACED))
|
||||
return 0;
|
||||
tcp->flags |= TCB_FOLLOWFORK;
|
||||
setbpt(tcp);
|
||||
} else {
|
||||
int pid;
|
||||
int bpt;
|
||||
|
||||
if (!(tcp->flags & TCB_FOLLOWFORK))
|
||||
return 0;
|
||||
|
||||
bpt = tcp->flags & TCB_BPTSET;
|
||||
|
||||
if (syserror(tcp)) {
|
||||
@ -943,17 +937,18 @@ internal_fork(struct tcb *tcp)
|
||||
dont_follow = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!followfork)
|
||||
return 0;
|
||||
|
||||
if (entering(tcp)) {
|
||||
if (!followfork || dont_follow)
|
||||
if (dont_follow)
|
||||
return 0;
|
||||
tcp->flags |= TCB_FOLLOWFORK;
|
||||
setbpt(tcp);
|
||||
}
|
||||
else {
|
||||
int bpt = tcp->flags & TCB_BPTSET;
|
||||
|
||||
if (!(tcp->flags & TCB_FOLLOWFORK))
|
||||
return 0;
|
||||
if (bpt)
|
||||
clearbpt(tcp);
|
||||
|
||||
@ -961,7 +956,6 @@ internal_fork(struct tcb *tcp)
|
||||
return 0;
|
||||
|
||||
pid = tcp->u_rval;
|
||||
tcp->flags |= TCB_FOLLOWFORK;
|
||||
tcpchild = alloctcb(pid);
|
||||
#ifdef SUNOS4
|
||||
#ifdef oldway
|
||||
|
Loading…
x
Reference in New Issue
Block a user