* 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

Reply via email to