]> granicus.if.org Git - strace/commitdiff
net.c: when printing struct msghdr.msg_control, also print its name
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 26 Jun 2016 23:57:18 +0000 (23:57 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 26 Jun 2016 23:57:18 +0000 (23:57 +0000)
* net.c (printcmsghdr): Skip control messages of zero length.
Always print "msg_control=" before the control message.
(do_msghdr): Print control message before its length, not after.
* tests/inet-cmsg.c (main): Update expected output.
* tests/scm_rights-fd.test: Likewise.

net.c
tests/inet-cmsg.c
tests/scm_rights-fd.test

diff --git a/net.c b/net.c
index 113632cb2a33b38d09c74a8f2059f45fc3cce2e6..6ffa7133d4e3a077a324b571ed6e583371a129b3 100644 (file)
--- 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("}");
index 7e4e0c926cc680e368fb6b0b63c12b02fd9ddf83..d15eb64de9f1d6741d33a361d96e9e1770813eb5 100644 (file)
@@ -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;
index d09137f073a188cc3cda220d7c02efebb6a6b60e..1277d1d2a3296257fca41edcb33648300797be8a 100755 (executable)
@@ -61,15 +61,16 @@ rights_data='\[4</dev/null>, 5</dev/zero>, 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"