From: Dmitry V. Levin Date: Tue, 1 May 2012 20:41:40 +0000 (+0000) Subject: Fix recvmmsg decode: do not show more data than actually returned X-Git-Tag: v4.7~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ea97658e78b6ce9fb768ffdd6a4b682c5df8e90;p=strace 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 050b746b..2911c73d 100644 --- a/net.c +++ b/net.c @@ -1441,7 +1441,7 @@ printmsghdr(struct tcb *tcp, long addr, unsigned long data_size) } 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 @@ printmmsghdr(struct tcb *tcp, long addr, unsigned int idx) 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 @@ decode_mmsg(struct tcb *tcp) 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 @@ sys_sendmmsg(struct tcb *tcp) } } else { if (verbose(tcp)) - decode_mmsg(tcp); + decode_mmsg(tcp, (unsigned long) -1L); } return 0; } @@ -1769,7 +1769,7 @@ sys_recvmmsg(struct tcb *tcp) 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);