* defs.h (TCB_WAITEXECVE) [IA64]: Don't define. * syscall.c (get_scno) [IA64]: Don't check for TCB_WAITEXECVE. (syscall_fixup) [IA64]: Check for post-execve signal. --- defs.h | 2 +- syscall.c | 29 ++++++++++++----------------- 2 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/defs.h b/defs.h index a869929..8802068 100644 --- a/defs.h +++ b/defs.h @@ -370,7 +370,7 @@ struct tcb { * See "stray syscall exit: eax = " message in syscall_fixup(). */ # if defined(ALPHA) || defined(AVR32) || defined(SPARC) || defined(SPARC64) \ - || defined(POWERPC) || defined(IA64) || defined(HPPA) \ + || defined(POWERPC) || defined(HPPA) \ || defined(SH) || defined(SH64) || defined(S390) || defined(S390X) \ || defined(ARM) || defined(MIPS) || defined(BFIN) # define TCB_WAITEXECVE 02000 /* ignore SIGTRAP after exceve */ diff --git a/syscall.c b/syscall.c index 3f551cd..1aba4da 100644 --- a/syscall.c +++ b/syscall.c @@ -980,24 +980,11 @@ get_scno(struct tcb *tcp) # define IA64_PSR_IS ((long)1 << 34) if (upeek (tcp, PT_CR_IPSR, &psr) >= 0) ia32 = (psr & IA64_PSR_IS) != 0; - if (!(tcp->flags & TCB_INSYSCALL)) { - if (ia32) { - if (upeek(tcp, PT_R1, &scno) < 0) /* orig eax */ - return -1; - } else { - if (upeek (tcp, PT_R15, &scno) < 0) - return -1; - } - /* Check if we return from execve. */ - if (tcp->flags & TCB_WAITEXECVE) { - tcp->flags &= ~TCB_WAITEXECVE; - return 0; - } - } else { - /* syscall in progress */ - if (upeek (tcp, PT_R8, &r8) < 0) + if (ia32) { + if (upeek(tcp, PT_R1, &scno) < 0) /* orig eax */ return -1; - if (upeek (tcp, PT_R10, &r10) < 0) + } else { + if (upeek (tcp, PT_R15, &scno) < 0) return -1; } # elif defined (ARM) @@ -1487,6 +1474,14 @@ syscall_fixup(struct tcb *tcp) fprintf(stderr, "stray syscall exit: r8 = %ld\n", r8); return 0; } + if (!ia32 && !(tcp->flags & TCB_INSYSCALL) && tcp->scno == SYS_execve) { + siginfo_t si; + + /* Check whether this is the execve post-exec signal. */ + if (ptrace(PTRACE_GETSIGINFO, tcp->pid, 0, (long)&si) == 0) + if (si.si_code == SI_USER) + return 0; + } #elif defined(CRISV10) || defined(CRISV32) if (upeek(tcp, 4*PT_R10, &r10) < 0) return -1; -- 1.6.6.1 Andreas. -- Andreas Schwab, sch...@redhat.com GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84 5EC7 45C6 250E 6F00 984E "And now for something completely different." ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel