From: Philippe O. <pom...@ne...> - 2014-01-31 14:18:30
|
* pathtrace.c: Add decoding for network-related file descriptors to pathtrace_match with an fdmatch call for all TRACE_NETWORK calls that have sockfd as arg[0]. No decoding for socket and socketpair calls that take no descriptor. * net.c: Add printing of decoded socket descriptors for syscalls that have such desc as arg[0] instead of printing a bare int. * tests/net-fd: New test file to test proper decoding of socket fd's. * tests/Makefile.am (TESTS): Add net-fd test to test suite. Signed-off-by: Philippe Ombredanne <pom...@ne...> --- net.c | 43 +++++++++++++++++++++++++++++-------------- pathtrace.c | 13 +++++++++---- tests/Makefile.am | 2 +- tests/net-fd | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 tests/net-fd diff --git a/net.c b/net.c index dd1e446..b6c8cc9 100644 --- a/net.c +++ b/net.c @@ -1711,7 +1711,8 @@ int sys_bind(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu", tcp->u_arg[2]); } @@ -1728,7 +1729,9 @@ int sys_listen(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + tprintf("%lu", tcp->u_arg[1]); } return 0; } @@ -1737,7 +1740,8 @@ static int do_accept(struct tcb *tcp, int flags_arg) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); return 0; } if (!tcp->u_arg[2]) @@ -1777,7 +1781,8 @@ int sys_send(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu, ", tcp->u_arg[2]); /* flags */ @@ -1790,7 +1795,8 @@ int sys_sendto(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu, ", tcp->u_arg[2]); /* flags */ @@ -1810,7 +1816,8 @@ int sys_sendmsg(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printmsghdr(tcp, tcp->u_arg[1], (unsigned long) -1L); /* flags */ tprints(", "); @@ -1824,7 +1831,8 @@ sys_sendmmsg(struct tcb *tcp) { if (entering(tcp)) { /* sockfd */ - tprintf("%d, ", (int) tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); if (!verbose(tcp)) { tprintf("%#lx, %u, ", tcp->u_arg[1], (unsigned int) tcp->u_arg[2]); @@ -1843,7 +1851,8 @@ int sys_recv(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); } else { if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[1]); @@ -1862,7 +1871,8 @@ sys_recvfrom(struct tcb *tcp) int fromlen; if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); } else { if (syserror(tcp)) { tprintf("%#lx, %lu, %lu, %#lx, %#lx", @@ -1906,7 +1916,8 @@ int sys_recvmsg(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); } else { if (syserror(tcp) || !verbose(tcp)) tprintf("%#lx", tcp->u_arg[1]); @@ -1926,7 +1937,8 @@ sys_recvmmsg(struct tcb *tcp) static char str[5 + TIMESPEC_TEXT_BUFSIZE]; if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); if (verbose(tcp)) { sprint_timespec(str, tcp, tcp->u_arg[4]); /* Abusing tcp->auxstr as temp storage. @@ -1976,7 +1988,8 @@ int sys_shutdown(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???"); } return 0; @@ -2077,7 +2090,8 @@ int sys_getsockopt(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printxval(socketlayers, tcp->u_arg[1], "SOL_???"); tprints(", "); switch (tcp->u_arg[1]) { @@ -2343,7 +2357,8 @@ int sys_setsockopt(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%ld, ", tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); printsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]); tprintf(", %lu", tcp->u_arg[4]); diff --git a/pathtrace.c b/pathtrace.c index 03f6681..b6d3e01 100644 --- a/pathtrace.c +++ b/pathtrace.c @@ -80,7 +80,7 @@ fdmatch(struct tcb *tcp, int fd) /* * Add a path to the set we're tracing. - * Secifying NULL will delete all paths. + * Specifying NULL will delete all paths. */ static void storepath(const char *path) @@ -158,7 +158,7 @@ pathtrace_match(struct tcb *tcp) s = tcp->s_ent; - if (!(s->sys_flags & (TRACE_FILE | TRACE_DESC))) + if (!(s->sys_flags & (TRACE_FILE | TRACE_DESC | TRACE_NETWORK))) return 0; /* @@ -339,11 +339,13 @@ pathtrace_match(struct tcb *tcp) s->sys_func == sys_timerfd_settime || s->sys_func == sys_timerfd_gettime || s->sys_func == sys_epoll_create || + s->sys_func == sys_socket || + s->sys_func == sys_socketpair || strcmp(s->sys_name, "fanotify_init") == 0) { /* - * These have TRACE_FILE or TRACE_DESCRIPTOR set, but they - * don't have any file descriptor or path args to test. + * These have TRACE_FILE or TRACE_DESCRIPTOR or TRACE_NETWORK set, + * but they don't have any file descriptor or path args to test. */ return 0; } @@ -359,5 +361,8 @@ pathtrace_match(struct tcb *tcp) if (s->sys_flags & TRACE_DESC) return fdmatch(tcp, tcp->u_arg[0]); + if (s->sys_flags & TRACE_NETWORK) + return fdmatch(tcp, tcp->u_arg[0]); + return 0; } diff --git a/tests/Makefile.am b/tests/Makefile.am index d8262f0..89bc3eb 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,7 +5,7 @@ AM_CFLAGS = $(WARN_CFLAGS) check_PROGRAMS = net-accept-connect set_ptracer_any sigaction TESTS = ptrace_setoptions strace-f qual_syscall sigaction.sh stat net \ - detach-sleeping detach-stopped detach-running + detach-sleeping detach-stopped detach-running net-fd LOG_COMPILER = $(srcdir)/run.sh diff --git a/tests/net-fd b/tests/net-fd new file mode 100644 index 0000000..1be5b77 --- /dev/null +++ b/tests/net-fd @@ -0,0 +1,43 @@ +#!/bin/sh + +# Check how network syscalls are traced when decoding socket descriptors + +. "${srcdir=.}/init.sh" + +check_prog grep +check_prog rm + +rm -f $LOG.* + +./net-accept-connect || + fail_ 'net-accept-connect failed' + +# using -y to test socket descriptors 'paths' decoding +args="-tt -ff -y -o $LOG -enetwork ./net-accept-connect" +$STRACE $args || + fail_ "strace $args failed" + +"$srcdir"/../strace-log-merge $LOG > $LOG || { + cat $LOG + fail_ 'strace-log-merge failed' +} + +rm -f $LOG.* + +grep_log() +{ + local syscall="$1"; shift + local prefix='[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +' + + LC_ALL=C grep -E -x "$prefix$syscall$@" $LOG > /dev/null || { + cat $LOG + fail_ "strace -enetwork failed to trace \"$syscall\" properly" + } +} +grep_log bind '\(0<socket:\[[0-9]+\]>, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, 15\) += 0' +grep_log listen '\(0<socket:\[[0-9]+\]>, 5\) += 0' +grep_log getsockname '\(0<socket:\[[0-9]+\]>, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, \[15\]\) += 0' +grep_log accept '\(0<socket:\[[0-9]+\]>, \{sa_family=AF_(LOCAL|UNIX|FILE), NULL\}, \[2\]\) += 1' +grep_log connect '\(1<socket:\[[0-9]+\]>, \{sa_family=AF_(LOCAL|UNIX|FILE), sun_path="local-stream"\}, 15\) += 0' + +exit 0 -- 1.8.1.msysgit.1 |