Fix recvmmsg decode: do not show more data than actually returned
This change complements recent fix for recvmsg decoding.
* net.c (printmmsghdr): Add msg_len parameter to pass down to do_msghdr.
When this parameter is zero, pass mmsghdr.msg_len to do_msghdr instead.
(decode_mmsg): Add msg_len parameter, pass it down to printmmsghdr.
(sys_sendmmsg): Call decode_mmsg with msg_len == (unsigned long) -1L.
(sys_recvmmsg): Call decode_mmsg with msg_len == 0.
diff --git a/net.c b/net.c
index 050b746..2911c73 100644
--- a/net.c
+++ b/net.c
@@ -1441,7 +1441,7 @@
}
static void
-printmmsghdr(struct tcb *tcp, long addr, unsigned int idx)
+printmmsghdr(struct tcb *tcp, long addr, unsigned int idx, unsigned long msg_len)
{
struct mmsghdr {
struct msghdr msg_hdr;
@@ -1454,12 +1454,12 @@
return;
}
tprints("{");
- do_msghdr(tcp, &mmsg.msg_hdr, (unsigned long) -1L);
+ do_msghdr(tcp, &mmsg.msg_hdr, msg_len ? msg_len : mmsg.msg_len);
tprintf(", %u}", mmsg.msg_len);
}
static void
-decode_mmsg(struct tcb *tcp)
+decode_mmsg(struct tcb *tcp, unsigned long msg_len)
{
/* mmsgvec */
if (syserror(tcp)) {
@@ -1472,7 +1472,7 @@
for (i = 0; i < len; ++i) {
if (i)
tprints(", ");
- printmmsghdr(tcp, tcp->u_arg[1], i);
+ printmmsghdr(tcp, tcp->u_arg[1], i, msg_len);
}
tprints("}");
}
@@ -1659,7 +1659,7 @@
}
} else {
if (verbose(tcp))
- decode_mmsg(tcp);
+ decode_mmsg(tcp, (unsigned long) -1L);
}
return 0;
}
@@ -1769,7 +1769,7 @@
return 0;
} else {
if (verbose(tcp)) {
- decode_mmsg(tcp);
+ decode_mmsg(tcp, 0);
/* timeout on entrance */
tprintf(", %s", tcp->auxstr ? tcp->auxstr : "{...}");
free((void *) tcp->auxstr);