summaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-04-28 14:26:18 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-04-28 14:26:18 +0200
commite0bc222263cf47a43e1b26d55edb2ffadc8ccbff (patch)
tree6c7f91e344fa5007eb8f2ea9e57e26b3a6e7d261 /net.c
parent54432560a846a466341874c11c8400d4b00def1e (diff)
downloadstrace-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.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/net.c b/net.c
index c7f0b97..fba521b 100644
--- a/net.c
+++ b/net.c
@@ -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_???");