diff options
Diffstat (limited to 'compiler-rt/test/dfsan/custom.cpp')
| -rw-r--r-- | compiler-rt/test/dfsan/custom.cpp | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/compiler-rt/test/dfsan/custom.cpp b/compiler-rt/test/dfsan/custom.cpp index f544e481b726..cede0d64dbcf 100644 --- a/compiler-rt/test/dfsan/custom.cpp +++ b/compiler-rt/test/dfsan/custom.cpp @@ -768,26 +768,53 @@ void test_recvmsg() { ssize_t sent = sendmsg(sockfds[0], &smsg, 0); assert(sent > 0); - char rbuf[128]; - struct iovec riovs[2] = {{&rbuf[0], 4}, {&rbuf[4], 4}}; - struct msghdr rmsg = {}; - rmsg.msg_iov = riovs; - rmsg.msg_iovlen = 2; - - dfsan_set_label(i_label, rbuf, sizeof(rbuf)); - dfsan_set_label(i_label, &rmsg, sizeof(rmsg)); - - DEFINE_AND_SAVE_ORIGINS(rmsg) - - ssize_t received = recvmsg(sockfds[1], &rmsg, 0); - assert(received == sent); - assert(memcmp(sbuf, rbuf, 8) == 0); - ASSERT_ZERO_LABEL(received); - ASSERT_READ_ZERO_LABEL(&rmsg, sizeof(rmsg)); - ASSERT_READ_ZERO_LABEL(&rbuf[0], 8); - ASSERT_READ_LABEL(&rbuf[8], 1, i_label); - - ASSERT_SAVED_ORIGINS(rmsg) + { + char rpbuf[2]; + struct iovec peek_iov; + peek_iov.iov_base = rpbuf; + peek_iov.iov_len = 2; + + struct msghdr peek_header = {}; + peek_header.msg_iov = &peek_iov; + peek_header.msg_iovlen = 1; + + dfsan_set_label(i_label, rpbuf, sizeof(rpbuf)); + dfsan_set_label(i_label, &peek_header, sizeof(peek_header)); + + DEFINE_AND_SAVE_ORIGINS(peek_header) + + ssize_t received = recvmsg(sockfds[1], &peek_header, MSG_PEEK | MSG_TRUNC); + assert(received == sent); + assert(memcmp(sbuf, rpbuf, 2) == 0); + ASSERT_ZERO_LABEL(received); + ASSERT_READ_ZERO_LABEL(&peek_header, sizeof(peek_header)); + ASSERT_READ_ZERO_LABEL(&rpbuf[0], 0); + + ASSERT_SAVED_ORIGINS(peek_header) + } + + { + char rbuf[128]; + struct iovec riovs[2] = {{&rbuf[0], 4}, {&rbuf[4], 4}}; + struct msghdr rmsg = {}; + rmsg.msg_iov = riovs; + rmsg.msg_iovlen = 2; + + dfsan_set_label(i_label, rbuf, sizeof(rbuf)); + dfsan_set_label(i_label, &rmsg, sizeof(rmsg)); + + DEFINE_AND_SAVE_ORIGINS(rmsg) + + ssize_t received = recvmsg(sockfds[1], &rmsg, 0); + assert(received == sent); + assert(memcmp(sbuf, rbuf, 8) == 0); + ASSERT_ZERO_LABEL(received); + ASSERT_READ_ZERO_LABEL(&rmsg, sizeof(rmsg)); + ASSERT_READ_ZERO_LABEL(&rbuf[0], 8); + ASSERT_READ_LABEL(&rbuf[8], 1, i_label); + + ASSERT_SAVED_ORIGINS(rmsg) + } close(sockfds[0]); close(sockfds[1]); |
