net.c: when printing struct msghdr.msg_control, also print its name
* 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.
This commit is contained in:
parent
cf0ef0852c
commit
00ba20aae1
15
net.c
15
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("}");
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user