#include <sys/epoll.h>
#include <sys/resource.h>
#include <sys/select.h>
+#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
return ret;
}
+SANITIZER_INTERFACE_ATTRIBUTE ssize_t __dfsw_recvmsg(
+ int sockfd, struct msghdr *msg, int flags, dfsan_label sockfd_label,
+ dfsan_label msg_label, dfsan_label flags_label, dfsan_label *ret_label) {
+ ssize_t ret = recvmsg(sockfd, msg, flags);
+ if (ret >= 0) {
+ dfsan_set_label(0, msg, sizeof(*msg));
+ dfsan_set_label(0, msg->msg_name, msg->msg_namelen);
+ dfsan_set_label(0, msg->msg_control, msg->msg_controllen);
+ for (size_t remaining = ret, i = 0; remaining > 0; ++i) {
+ assert(i < msg->msg_iovlen);
+ struct iovec *iov = &msg->msg_iov[i];
+ size_t written = remaining < iov->iov_len ? remaining : iov->iov_len;
+ dfsan_set_label(0, iov->iov_base, written);
+ remaining -= written;
+ }
+ }
+ *ret_label = 0;
+ return ret;
+}
+
SANITIZER_INTERFACE_ATTRIBUTE int
__dfsw_socketpair(int domain, int type, int protocol, int sv[2],
dfsan_label domain_label, dfsan_label type_label,
#include <sys/epoll.h>
#include <sys/resource.h>
#include <sys/select.h>
+#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
free(crv);
}
+void test_recvmsg() {
+ int sockfds[2];
+ int ret = socketpair(AF_UNIX, SOCK_DGRAM, 0, sockfds);
+ assert(ret != -1);
+
+ char sbuf[] = "abcdefghijkl";
+ struct iovec siovs[2] = {{&sbuf[0], 4}, {&sbuf[4], 4}};
+ struct msghdr smsg = {};
+ smsg.msg_iov = siovs;
+ smsg.msg_iovlen = 2;
+
+ 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));
+
+ 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);
+
+ close(sockfds[0]);
+ close(sockfds[1]);
+}
+
void test_read() {
char buf[16];
dfsan_set_label(i_label, buf, 1);
test_pread();
test_pthread_create();
test_read();
+ test_recvmsg();
test_sched_getaffinity();
test_select();
test_sigaction();