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>
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 @@
 }
 
 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 @@
 }
 
 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 @@
 		tprintf("%#lx", addr);
 		return;
 	}
-	do_msghdr(tcp, &msg);
+	do_msghdr(tcp, &msg, data_size);
 }
 
 static void
@@ -1454,7 +1455,7 @@
 		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 @@
 {
 	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 @@
 		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_???");