From 76989d7a16cb9683d0a75a6261f18ced66d0c04a Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 7 Jun 2005 23:21:31 +0000 Subject: [PATCH] 2005-06-06 Roland McGrath * defs.h (struct sysent): New member `native_scno'. (known_scno): Declare new function. * linux/syscallent.h: Add new final field to interesting syscalls. * syscall.c (known_scno): New function. (dumpio, internal_syscall, syscall_fixup, trace_syscall): Use it. * process.c (internal_fork, internal_exit): Likewise. [IA64] (ARG_STACKSIZE, ARG_PTID, ARG_CTID, ARG_TLS): Likewise. * strace.c (proc_open): Likewise. * util.c [LINUX] (setbpt): Likewise. * linux/syscall.h: Remove [!defined(X86_64)] from conditional for defining SYS_socket_subcall et al. * linux/syscallent.h: Likewise for #error check. * syscall.c (trace_syscall): Likewise for SYS_{socketcall,ipc} cases. Fixes RH#158934. --- defs.h | 2 ++ strace.c | 2 +- util.c | 16 ++++++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/defs.h b/defs.h index e32e3ed9..24cf19cd 100644 --- a/defs.h +++ b/defs.h @@ -424,6 +424,7 @@ extern void set_overhead P((int)); extern void qualify P((char *)); extern void newoutf P((struct tcb *)); extern int get_scno P((struct tcb *)); +extern long known_scno P((struct tcb *)); extern int trace_syscall P((struct tcb *)); extern void printxval P((const struct xlat *, int, const char *)); extern int printargs P((struct tcb *)); @@ -526,6 +527,7 @@ struct sysent { int sys_flags; int (*sys_func)(); const char *sys_name; + long native_scno; /* Match against SYS_* constants. */ }; extern const struct sysent *sysent; diff --git a/strace.c b/strace.c index 12f1fc79..f028de39 100644 --- a/strace.c +++ b/strace.c @@ -1002,7 +1002,7 @@ int attaching; if (tcp->status.PR_WHY == PR_SYSENTRY) { tcp->flags &= ~TCB_INSYSCALL; get_scno(tcp); - if (tcp->scno == SYS_execve) + if (known_scno(tcp) == SYS_execve) break; } /* Set it running: maybe execve will be next. */ diff --git a/util.c b/util.c index e477cf10..4f2dd5e4 100644 --- a/util.c +++ b/util.c @@ -1205,6 +1205,9 @@ struct tcb *tcp; #ifndef CLONE_PTRACE # define CLONE_PTRACE 0x00002000 #endif +#ifndef CLONE_STOPPED +# define CLONE_STOPPED 0x02000000 +#endif #ifdef IA64 @@ -1369,7 +1372,16 @@ typedef int arg_setup_state; static int set_arg0 (struct tcb *tcp, void *cookie, long val) { - return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val); + long oldval,newval; + if (get_arg0(tcp, cookie, &oldval) < 0) + abort (); + if (ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val) < 0) + return -1; + if (get_arg0(tcp, cookie, &newval) < 0) + abort (); + fprintf(stderr, "XXX old %lx set %lx new %lx\n", + oldval,val,newval); + return 0; } static int @@ -1404,7 +1416,7 @@ struct tcb *tcp; return -1; } - switch (tcp->scno) { + switch (known_scno(tcp)) { #ifdef SYS_vfork case SYS_vfork: #endif