diff --git a/net.c b/net.c index 113632cb..6ffa7133 100644 --- a/net.c +++ b/net.c @@ -341,9 +341,12 @@ printcmsghdr(struct tcb *tcp, unsigned long addr, size_t len) #endif sizeof(struct cmsghdr); + if (!len) + return; + tprints(", msg_control="); + char *buf = len < cmsg_size ? NULL : malloc(len); if (!buf || umoven(tcp, addr, len, buf) < 0) { - tprints(", msg_control="); printaddr(addr); free(buf); return; @@ -351,7 +354,7 @@ printcmsghdr(struct tcb *tcp, unsigned long addr, size_t len) union_cmsghdr u = { .ptr = buf }; - tprints(", ["); + tprints("["); while (len >= cmsg_size) { size_t cmsg_len = #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 @@ -413,10 +416,10 @@ do_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size) tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen, (unsigned long)msg->msg_iov, IOV_DECODE_STR, data_size); - tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen); - if (msg->msg_controllen) - printcmsghdr(tcp, (unsigned long) msg->msg_control, - msg->msg_controllen); + printcmsghdr(tcp, (unsigned long) msg->msg_control, + msg->msg_controllen); + tprintf(", msg_controllen=%lu", (unsigned long) msg->msg_controllen); + tprints(", msg_flags="); printflags(msg_flags, msg->msg_flags, "MSG_???"); tprints("}"); diff --git a/tests/inet-cmsg.c b/tests/inet-cmsg.c index 7e4e0c92..d15eb64d 100644 --- a/tests/inet-cmsg.c +++ b/tests/inet-cmsg.c @@ -146,10 +146,10 @@ main(void) assert(!close(0)); printf("recvmsg(0, {msg_name(%u)={sa_family=AF_INET, sin_port=htons(%u)" - ", sin_addr=inet_addr(\"127.0.0.1\")}, msg_iov(1)=[{\"%s\", %zu}]" - ", msg_controllen=%lu, [", + ", sin_addr=inet_addr(\"127.0.0.1\")}, msg_iov(1)=[{\"%s\", %u}]" + ", msg_control=[", (unsigned) mh.msg_namelen, ntohs(addr.sin_port), - data, size, (unsigned long) mh.msg_controllen); + data, (unsigned) size); struct cmsghdr *c; for (c = CMSG_FIRSTHDR(&mh); c; c = CMSG_NXTHDR(&mh, c)) { @@ -186,7 +186,8 @@ main(void) } printf("}"); } - printf("], msg_flags=0}, 0) = %zu\n", size); + printf("], msg_controllen=%lu, msg_flags=0}, 0) = %u\n", + (unsigned long) mh.msg_controllen, (unsigned) size); puts("+++ exited with 0 +++"); return 0; diff --git a/tests/scm_rights-fd.test b/tests/scm_rights-fd.test index d09137f0..1277d1d2 100755 --- a/tests/scm_rights-fd.test +++ b/tests/scm_rights-fd.test @@ -61,15 +61,16 @@ rights_data='\[4, 5, 6<'"$path6"'>\]' iov='\[\{"'"$sample"'", 15\}\]' ids='\{pid='"$n"', uid=[0-9]+, gid=[0-9]+\}' -msg='\{msg_name\(0\)=NULL, msg_iov\(1\)='"$iov"', msg_controllen='"$n" +msg_head='\{msg_name\(0\)=NULL, msg_iov\(1\)='"$iov"', msg_control=' +msg_tail=', msg_controllen='"$n"', msg_flags=0' rights='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, '"$rights_data"'\}' creds='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_CREDENTIALS, '"$ids"'\}' EXPECTED="$LOG.expected" cat > "$EXPECTED" << __EOF__ -sendmsg\\(3$socket, $msg, \\[$rights\\], msg_flags=0\\}, 0\\) = 15 -recvmsg\\(0$socket, $msg, \\[$creds, $rights\\], msg_flags=0\\}, 0\\) = 15 +sendmsg\\(3$socket, $msg_head\\[$rights\\]$msg_tail\\}, 0\\) = 15 +recvmsg\\(0$socket, $msg_head\\[$creds, $rights\\]$msg_tail\\}, 0\\) = 15 __EOF__ match_grep "$LOG" "$EXPECTED"