diff -x CVS -urpN 2009-01-13/ChangeLog 2009-01-14/ChangeLog --- 2009-01-13/ChangeLog 2009-01-09 18:22:56.000000000 +0100 +++ 2009-01-14/ChangeLog 2009-01-13 19:30:55.000000000 +0100 @@ -1,3 +1,18 @@ +2009-01-13 Denys Vlasenko <[email protected]> + + Fixes for ptrace() argument parsing. + * process.c: Add parsing of PTRACE_SETOPTIONS, PTRACE_GETEVENTMSG, + PTRACE_GETSIGINFO, PTRACE_SETSIGINFO. + * strace.c (handle_stopped_tcbs): Make PTRACE_SETOPTIONS + define check more robust. + * defs.h: Declare several "extern const struct xlat" arrays here. + * desc.c: Remove open_mode_flags[] and open_access_modes[] + extern declarations. + * net.c: Remove open_mode_flags[] extern declaration. + * sock.c: Remove addrfams[] extern declaration. + * util.c: Remove struct_user_offsets[] extern declaration. + * signal.c: Remove open_mode_flags[] extern declaration. + 2009-01-09 Denys Vlasenko <[email protected]> * defs.h: Add new struct tcb fields: wait_status, next_need_service. diff -x CVS -urpN 2009-01-13/defs.h 2009-01-14/defs.h --- 2009-01-13/defs.h 2009-01-09 18:22:56.000000000 +0100 +++ 2009-01-14/defs.h 2009-01-13 19:30:55.000000000 +0100 @@ -26,7 +26,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: defs.h,v 1.93 2009/01/09 17:22:56 vda_linux Exp $ + * $Id: defs.h,v 1.94 2009/01/13 18:30:55 vda_linux Exp $ */ #ifdef HAVE_CONFIG_H @@ -417,6 +417,11 @@ struct xlat { char *str; }; +extern const struct xlat open_mode_flags[]; +extern const struct xlat addrfams[]; +extern const struct xlat struct_user_offsets[]; +extern const struct xlat open_access_modes[]; + /* Format of syscall return values */ #define RVAL_DECIMAL 000 /* decimal format */ #define RVAL_HEX 001 /* hex format */ diff -x CVS -urpN 2009-01-13/desc.c 2009-01-14/desc.c --- 2009-01-13/desc.c 2009-01-06 16:12:52.000000000 +0100 +++ 2009-01-14/desc.c 2009-01-13 19:30:55.000000000 +0100 @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: desc.c,v 1.38 2009/01/06 15:12:52 vda_linux Exp $ + * $Id: desc.c,v 1.39 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -261,8 +261,6 @@ printflock64(struct tcb *tcp, long addr, } #endif -extern const struct xlat open_mode_flags[]; - /* * low bits of the open(2) flags define access mode, * other bits are real flags. @@ -270,7 +268,6 @@ extern const struct xlat open_mode_flags static const char * sprint_open_modes(mode_t flags) { - extern const struct xlat open_access_modes[]; static char outstr[1024]; const char *str = xlookup(open_access_modes, flags & 3); const char *sep = ""; diff -x CVS -urpN 2009-01-13/net.c 2009-01-14/net.c --- 2009-01-13/net.c 2009-01-01 23:47:51.000000000 +0100 +++ 2009-01-14/net.c 2009-01-13 19:30:55.000000000 +0100 @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: net.c,v 1.59 2009/01/01 22:47:51 ldv Exp $ + * $Id: net.c,v 1.60 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -1499,8 +1499,6 @@ struct tcb *tcp; return sys_accept(tcp); } -extern const struct xlat open_mode_flags[]; - static int do_pipe(struct tcb *tcp, int flags_arg) { diff -x CVS -urpN 2009-01-13/process.c 2009-01-14/process.c --- 2009-01-13/process.c 2009-01-06 22:45:06.000000000 +0100 +++ 2009-01-14/process.c 2009-01-13 19:30:55.000000000 +0100 @@ -34,7 +34,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: process.c,v 1.122 2009/01/06 21:45:06 vda_linux Exp $ + * $Id: process.c,v 1.123 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -2231,7 +2231,7 @@ struct tcb *tcp; else if (umove(tcp, tcp->u_arg[2], &si) < 0) tprintf("{???}"); else - printsiginfo(&si, verbose (tcp)); + printsiginfo(&si, verbose(tcp)); /* options */ tprintf(", "); printflags(wait4_options, tcp->u_arg[3], "W???"); @@ -2332,6 +2332,18 @@ static const struct xlat ptrace_cmds[] = #ifdef PTRACE_SETVRREGS { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", }, #endif +#ifdef PTRACE_SETOPTIONS + { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", }, +#endif +#ifdef PTRACE_GETEVENTMSG + { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", }, +#endif +#ifdef PTRACE_GETSIGINFO + { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", }, +#endif +#ifdef PTRACE_SETSIGINFO + { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", }, +#endif #ifdef SUNOS4 { PTRACE_READDATA, "PTRACE_READDATA" }, { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" }, @@ -2361,7 +2373,9 @@ static const struct xlat ptrace_cmds[] = #endif /* !I386 */ { PTRACE_GETUCODE, "PTRACE_GETUCODE" }, #endif /* SUNOS4 */ + #else /* FREEBSD */ + { PT_TRACE_ME, "PT_TRACE_ME" }, { PT_READ_I, "PT_READ_I" }, { PT_READ_D, "PT_READ_D" }, @@ -2386,9 +2400,35 @@ static const struct xlat ptrace_cmds[] = }; #ifndef FREEBSD -#ifndef SUNOS4_KERNEL_ARCH_KLUDGE -static -#endif /* !SUNOS4_KERNEL_ARCH_KLUDGE */ +#ifdef PTRACE_SETOPTIONS +static const struct xlat ptrace_setoptions_flags[] = { +#ifdef PTRACE_O_TRACESYSGOOD + { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" }, +#endif +#ifdef PTRACE_O_TRACEFORK + { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" }, +#endif +#ifdef PTRACE_O_TRACEVFORK + { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" }, +#endif +#ifdef PTRACE_O_TRACECLONE + { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" }, +#endif +#ifdef PTRACE_O_TRACEEXEC + { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" }, +#endif +#ifdef PTRACE_O_TRACEVFORKDONE + { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"}, +#endif +#ifdef PTRACE_O_TRACEEXIT + { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" }, +#endif + { 0, NULL }, +}; +#endif +#endif + +#ifndef FREEBSD const struct xlat struct_user_offsets[] = { #ifdef LINUX #if defined(S390) || defined(S390X) @@ -3192,6 +3232,30 @@ struct tcb *tcp; case PTRACE_DETACH: printsignal(tcp->u_arg[3]); break; +#ifdef PTRACE_SETOPTIONS + case PTRACE_SETOPTIONS: + printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???"); + break; +#endif +#ifdef PTRACE_SETSIGINFO + case PTRACE_SETSIGINFO: { + siginfo_t si; + if (!tcp->u_arg[3]) + tprintf("NULL"); + else if (syserror(tcp)) + tprintf("%#lx", tcp->u_arg[3]); + else if (umove(tcp, tcp->u_arg[3], &si) < 0) + tprintf("{???}"); + else + printsiginfo(&si, verbose(tcp)); + break; + } +#endif +#ifdef PTRACE_GETSIGINFO + case PTRACE_GETSIGINFO: + /* Don't print anything, do it at syscall return. */ + break; +#endif default: tprintf("%#lx", tcp->u_arg[3]); break; @@ -3207,6 +3271,20 @@ struct tcb *tcp; printnum(tcp, tcp->u_arg[3], "%#lx"); break; #endif +#ifdef PTRACE_GETSIGINFO + case PTRACE_GETSIGINFO: { + siginfo_t si; + if (!tcp->u_arg[3]) + tprintf("NULL"); + else if (syserror(tcp)) + tprintf("%#lx", tcp->u_arg[3]); + else if (umove(tcp, tcp->u_arg[3], &si) < 0) + tprintf("{???}"); + else + printsiginfo(&si, verbose(tcp)); + break; + } +#endif } } #endif /* LINUX */ diff -x CVS -urpN 2009-01-13/signal.c 2009-01-14/signal.c --- 2009-01-13/signal.c 2008-12-17 18:22:03.000000000 +0100 +++ 2009-01-14/signal.c 2009-01-13 19:30:55.000000000 +0100 @@ -30,7 +30,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: signal.c,v 1.72 2008/12/17 17:22:03 vda_linux Exp $ + * $Id: signal.c,v 1.73 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -1967,7 +1967,7 @@ sys_rt_sigqueueinfo(tcp) if (umove(tcp, tcp->u_arg[2], &si) < 0) tprintf("%#lx", tcp->u_arg[2]); else - printsiginfo(&si, verbose (tcp)); + printsiginfo(&si, verbose(tcp)); } return 0; } @@ -1993,7 +1993,7 @@ int sys_rt_sigtimedwait(tcp) if (umove(tcp, tcp->u_arg[1], &si) < 0) tprintf("%#lx", tcp->u_arg[1]); else - printsiginfo(&si, verbose (tcp)); + printsiginfo(&si, verbose(tcp)); /* XXX For now */ tprintf(", %#lx", tcp->u_arg[2]); tprintf(", %d", (int) tcp->u_arg[3]); @@ -2011,8 +2011,6 @@ struct tcb *tcp; return 0; } -extern const struct xlat open_mode_flags[]; - static int do_signalfd(struct tcb *tcp, int flags_arg) { diff -x CVS -urpN 2009-01-13/sock.c 2009-01-14/sock.c --- 2009-01-13/sock.c 2008-12-30 19:47:56.000000000 +0100 +++ 2009-01-14/sock.c 2009-01-13 19:30:55.000000000 +0100 @@ -24,7 +24,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: sock.c,v 1.16 2008/12/30 18:47:56 vda_linux Exp $ + * $Id: sock.c,v 1.17 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -47,8 +47,6 @@ #endif #include <net/if.h> -extern const struct xlat addrfams[]; - static const struct xlat iffflags[] = { { IFF_UP, "IFF_UP" }, { IFF_BROADCAST, "IFF_BROADCAST" }, diff -x CVS -urpN 2009-01-13/strace.c 2009-01-14/strace.c --- 2009-01-13/strace.c 2009-01-09 18:22:56.000000000 +0100 +++ 2009-01-14/strace.c 2009-01-13 19:30:55.000000000 +0100 @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: strace.c,v 1.98 2009/01/09 17:22:56 vda_linux Exp $ + * $Id: strace.c,v 1.99 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -2525,8 +2525,10 @@ handle_stopped_tcbs(struct tcb *tcp) } } /* Add more OSes after you verified it works for them. */ -/* PTRACE_SETOPTIONS is not a #define. PT_SETOPTIONS is. */ -#if defined LINUX && defined PT_SETOPTIONS +/* PTRACE_SETOPTIONS may be an enum, not a #define. + * But sometimes we can test for it by checking PT_SETOPTIONS. + */ +#if defined LINUX && (defined PTRACE_SETOPTIONS || defined PT_SETOPTIONS) # ifndef PTRACE_O_TRACESYSGOOD # define PTRACE_O_TRACESYSGOOD 0x00000001 # endif @@ -2557,7 +2559,7 @@ handle_stopped_tcbs(struct tcb *tcp) goto tracing; } -#if defined LINUX && defined PT_SETOPTIONS +#if defined LINUX && (defined PTRACE_SETOPTIONS || defined PT_SETOPTIONS) if (ptrace_stop_sig != SIGTRAP && WSTOPSIG(status) == SIGTRAP) { /* * We told ptrace to report SIGTRAP | 0x80 on this process diff -x CVS -urpN 2009-01-13/util.c 2009-01-14/util.c --- 2009-01-13/util.c 2009-01-06 22:45:06.000000000 +0100 +++ 2009-01-14/util.c 2009-01-13 19:30:55.000000000 +0100 @@ -30,7 +30,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: util.c,v 1.85 2009/01/06 21:45:06 vda_linux Exp $ + * $Id: util.c,v 1.86 2009/01/13 18:30:55 vda_linux Exp $ */ #include "defs.h" @@ -1116,7 +1116,6 @@ long *res; } is_sun4m = strcmp(name.machine, "sun4m") == 0; if (is_sun4m) { - extern const struct xlat struct_user_offsets[]; const struct xlat *x; for (x = struct_user_offsets; x->str; x++)
------------------------------------------------------------------------------ Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise -Strategies to boost innovation and cut costs with open source participation -Receive a $600 discount off the registration fee with the source code: SFAD http://p.sf.net/sfu/XcvMzF8H _______________________________________________ Strace-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/strace-devel
