From: Wichert Akkerman Date: Sun, 3 Sep 2000 21:56:29 +0000 (+0000) Subject: process.c: perform bpt trick for clone as well so we can get the pid of the child... X-Git-Tag: v4.5.18~1112 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9b0c31d663e51a98383f83521f4b6081986ee47c;p=strace process.c: perform bpt trick for clone as well so we can get the pid of the child before it starts doing something file.c: rename dirent64 struct to kernel_dirent64 so things compile again with newer libcs --- diff --git a/ChangeLog b/ChangeLog index 7f6d4381..114c2220 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2000-09-03 Wichert Akkerman + + * process.c: perform bpt trick for clone as well so we can get the + pid of the child before it starts doing something + * file.c: rename dirent64 struct to kernel_dirent64 so things compile + again with newer libcs + 2000-09-01 Wichert Akkerman * lots of files: merge patch from Gaƫl Roualland to add diff --git a/file.c b/file.c index a74beda9..911090c8 100644 --- a/file.c +++ b/file.c @@ -35,6 +35,7 @@ #include #ifdef linux #define dirent kernel_dirent +#define dirent64 kernel_dirent64 #include #include #undef dirent diff --git a/process.c b/process.c index dda3b9ee..47fc87d2 100644 --- a/process.c +++ b/process.c @@ -548,12 +548,18 @@ struct tcb *tcp; } tcp->flags |= TCB_FOLLOWFORK; - tcp->u_arg[0] |= CLONE_PTRACE; - setarg(tcp, 0); + + if (setbpt(tcp) < 0) + return 0; } else { + int bpt = tcp->flags & TCB_BPTSET; + if (!(tcp->flags & TCB_FOLLOWFORK)) return 0; + if (bpt) + clearbpt(tcp); + if (syserror(tcp)) return 0; @@ -564,10 +570,21 @@ struct tcb *tcp; return 0; } - /* For fork we need to re-attach, but thanks to CLONE_PTRACE we're - * already attached. - */ + /* Attach to the new child */ + if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) { + perror("PTRACE_ATTACH"); + fprintf(stderr, "Too late?\n"); + droptcb(tcpchild); + return 0; + } + tcpchild->flags |= TCB_ATTACHED; + if (bpt) { + tcpchild->flags |= TCB_BPTSET; + tcpchild->baddr = tcp->baddr; + memcpy(tcpchild->inst, tcp->inst, + sizeof tcpchild->inst); + } newoutf(tcpchild); tcp->nchildren++; if (!qflag) diff --git a/test/clone.c b/test/clone.c index 1395b6b9..75bc5451 100644 --- a/test/clone.c +++ b/test/clone.c @@ -10,7 +10,7 @@ int main() { char stack[4096]; - if (clone(child, stack+4000, CLONE_VM|CLONE_FS|CLONE_FILES, NULL) != 0) - write(1, "original\n", 9); + clone(child, stack+4000, CLONE_VM|CLONE_FS|CLONE_FILES, NULL); + write(1, "original\n", 9); exit(0); }