diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-04-28 14:26:18 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-04-28 14:26:18 +0200 |
commit | e0bc222263cf47a43e1b26d55edb2ffadc8ccbff (patch) | |
tree | 6c7f91e344fa5007eb8f2ea9e57e26b3a6e7d261 /net.c | |
parent | 54432560a846a466341874c11c8400d4b00def1e (diff) | |
download | strace-e0bc222263cf47a43e1b26d55edb2ffadc8ccbff.tar.gz strace-e0bc222263cf47a43e1b26d55edb2ffadc8ccbff.tar.bz2 strace-e0bc222263cf47a43e1b26d55edb2ffadc8ccbff.tar.xz |
Fix recvmsg decode: do not show more data than actually returned
I noticed that "hostname -d" talks over netlink and gets 20 bytes
of response, but we show entire 1024 bytes of iov.
This changes fixes that.
* defs.h: New function tprint_iov_upto.
* io.c (tprint_iov_upto): Definition of this function.
(tprint_iov): Call tprint_iov_upto.
* net.c (do_msghdr): Add data_size parameter, pass it down to tprint_iov_upto.
(printmsghdr): Add data_size parameter, pass it down to do_msghdr.
(printmmsghdr): Call do_msghdr with data_size==ULONG_MAX.
(sys_sendmsg): Call printmsghdr with data_size==ULONG_MAX.
(sys_recvmsg): Call printmsghdr with data_size==tcp->u_rval.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'net.c')
-rw-r--r-- | net.c | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -29,6 +29,7 @@ */ #include "defs.h" +#include <limits.h> #include <sys/stat.h> #include <sys/socket.h> #include <sys/un.h> @@ -1405,14 +1406,14 @@ printcmsghdr(struct tcb *tcp, unsigned long addr, unsigned long len) } static void -do_msghdr(struct tcb *tcp, struct msghdr *msg) +do_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size) { tprintf("{msg_name(%d)=", msg->msg_namelen); printsock(tcp, (long)msg->msg_name, msg->msg_namelen); tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen); - tprint_iov(tcp, (unsigned long)msg->msg_iovlen, - (unsigned long)msg->msg_iov, 1); + tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen, + (unsigned long)msg->msg_iov, 1, data_size); #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen); @@ -1429,7 +1430,7 @@ do_msghdr(struct tcb *tcp, struct msghdr *msg) } static void -printmsghdr(struct tcb *tcp, long addr) +printmsghdr(struct tcb *tcp, long addr, unsigned long data_size) { struct msghdr msg; @@ -1437,7 +1438,7 @@ printmsghdr(struct tcb *tcp, long addr) tprintf("%#lx", addr); return; } - do_msghdr(tcp, &msg); + do_msghdr(tcp, &msg, data_size); } static void @@ -1454,7 +1455,7 @@ printmmsghdr(struct tcb *tcp, long addr, unsigned int idx) return; } tprints("{"); - do_msghdr(tcp, &mmsg.msg_hdr); + do_msghdr(tcp, &mmsg.msg_hdr, ULONG_MAX); tprintf(", %u}", mmsg.msg_len); } @@ -1638,7 +1639,7 @@ sys_sendmsg(struct tcb *tcp) { if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); - printmsghdr(tcp, tcp->u_arg[1]); + printmsghdr(tcp, tcp->u_arg[1], ULONG_MAX); /* flags */ tprints(", "); printflags(msg_flags, tcp->u_arg[2], "MSG_???"); @@ -1738,7 +1739,7 @@ sys_recvmsg(struct tcb *tcp) if (syserror(tcp) || !verbose(tcp)) tprintf("%#lx", tcp->u_arg[1]); else - printmsghdr(tcp, tcp->u_arg[1]); + printmsghdr(tcp, tcp->u_arg[1], tcp->u_rval); /* flags */ tprints(", "); printflags(msg_flags, tcp->u_arg[2], "MSG_???"); |