diff options
6 files changed, 89 insertions, 47 deletions
diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc index 44e77b2d608..fa7bf15a8ab 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cc +++ b/compiler-rt/lib/msan/msan_interceptors.cc @@ -710,33 +710,21 @@ INTERCEPTOR(SSIZE_T, recv, int fd, void *buf, SIZE_T len, int flags) { } INTERCEPTOR(SSIZE_T, recvfrom, int fd, void *buf, SIZE_T len, int flags, - void *srcaddr, void *addrlen) { + void *srcaddr, int *addrlen) { ENSURE_MSAN_INITED(); SIZE_T srcaddr_sz; - if (srcaddr) - srcaddr_sz = __sanitizer_get_socklen_t(addrlen); + if (srcaddr) srcaddr_sz = *addrlen; SSIZE_T res = REAL(recvfrom)(fd, buf, len, flags, srcaddr, addrlen); if (res > 0) { __msan_unpoison(buf, res); if (srcaddr) { - SIZE_T sz = __sanitizer_get_socklen_t(addrlen); + SIZE_T sz = *addrlen; __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz); } } return res; } -INTERCEPTOR(SSIZE_T, recvmsg, int fd, struct msghdr *msg, int flags) { - ENSURE_MSAN_INITED(); - SSIZE_T res = REAL(recvmsg)(fd, msg, flags); - if (res > 0) { - for (SIZE_T i = 0; i < __sanitizer_get_msghdr_iovlen(msg); ++i) - __msan_unpoison(__sanitizer_get_msghdr_iov_iov_base(msg, i), - __sanitizer_get_msghdr_iov_iov_len(msg, i)); - } - return res; -} - INTERCEPTOR(void *, calloc, SIZE_T nmemb, SIZE_T size) { if (CallocShouldReturnNullDueToOverflow(size, nmemb)) return 0; GET_MALLOC_STACK_TRACE; @@ -1200,7 +1188,6 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(epoll_pwait); INTERCEPT_FUNCTION(recv); INTERCEPT_FUNCTION(recvfrom); - INTERCEPT_FUNCTION(recvmsg); INTERCEPT_FUNCTION(dladdr); INTERCEPT_FUNCTION(dlopen); INTERCEPT_FUNCTION(dl_iterate_phdr); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index e7c9c0424d0..59aa77a2920 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -1044,6 +1044,37 @@ INTERCEPTOR(long double, modfl, long double x, long double *iptr) { #define INIT_MODF #endif +#if SANITIZER_INTERCEPT_RECVMSG +static void write_msghdr(void *ctx, struct __sanitizer_msghdr *msg) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg, sizeof(*msg)); + if (msg->msg_name) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_name, + REAL(strlen)((char *)msg->msg_name) + 1); + if (msg->msg_iov) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_iov, msg->msg_iovlen); + for (SIZE_T i = 0; i < msg->msg_iovlen; ++i) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_iov[i].iov_base, + msg->msg_iov[i].iov_len); + if (msg->msg_control) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, msg->msg_control, msg->msg_controllen); +} + +INTERCEPTOR(SSIZE_T, recvmsg, int fd, struct __sanitizer_msghdr *msg, + int flags) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, recvmsg, fd, msg, flags); + SSIZE_T res = REAL(recvmsg)(fd, msg, flags); + if (res >= 0) { + if (fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); + if (msg) write_msghdr(ctx, msg); + } + return res; +} +#define INIT_RECVMSG INTERCEPT_FUNCTION(recvmsg); +#else +#define INIT_RECVMSG +#endif + #define SANITIZER_COMMON_INTERCEPTORS_INIT \ INIT_STRCASECMP; \ INIT_STRNCASECMP; \ @@ -1074,4 +1105,5 @@ INTERCEPTOR(long double, modfl, long double x, long double *iptr) { INIT_GETSOCKOPT; \ INIT_ACCEPT; \ INIT_ACCEPT4; \ - INIT_MODF; + INIT_MODF; \ + INIT_RECVMSG; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index c2a3bd9566b..2da925cb85a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -78,5 +78,6 @@ # define SANITIZER_INTERCEPT_ACCEPT SI_NOT_WINDOWS # define SANITIZER_INTERCEPT_ACCEPT4 SI_LINUX # define SANITIZER_INTERCEPT_MODF SI_NOT_WINDOWS +# define SANITIZER_INTERCEPT_RECVMSG SI_NOT_WINDOWS #endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc index c269de65ca2..d6d095dcfc7 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc @@ -81,22 +81,6 @@ namespace __sanitizer { uptr sig_ign = (uptr)SIG_IGN; uptr sig_dfl = (uptr)SIG_DFL; - void* __sanitizer_get_msghdr_iov_iov_base(void* msg, int idx) { - return ((struct msghdr *)msg)->msg_iov[idx].iov_base; - } - - uptr __sanitizer_get_msghdr_iov_iov_len(void* msg, int idx) { - return ((struct msghdr *)msg)->msg_iov[idx].iov_len; - } - - uptr __sanitizer_get_msghdr_iovlen(void* msg) { - return ((struct msghdr *)msg)->msg_iovlen; - } - - uptr __sanitizer_get_socklen_t(void* socklen_ptr) { - return *(socklen_t*)socklen_ptr; - } - uptr __sanitizer_get_sigaction_sa_sigaction(void *act) { struct sigaction *a = (struct sigaction *)act; // Check that sa_sigaction and sa_handler are the same. @@ -136,6 +120,8 @@ COMPILER_CHECK(offsetof(struct __sanitizer_dl_phdr_info, dlpi_phnum) == offsetof(struct dl_phdr_info, dlpi_phnum)); #endif +COMPILER_CHECK(sizeof(socklen_t) == sizeof(unsigned)); + COMPILER_CHECK(sizeof(struct __sanitizer_addrinfo) == sizeof(struct addrinfo)); COMPILER_CHECK(offsetof(struct __sanitizer_addrinfo, ai_addr) == offsetof(struct addrinfo, ai_addr)); @@ -152,4 +138,34 @@ COMPILER_CHECK(offsetof(struct __sanitizer_hostent, h_aliases) == COMPILER_CHECK(offsetof(struct __sanitizer_hostent, h_addr_list) == offsetof(struct hostent, h_addr_list)); +COMPILER_CHECK(sizeof(struct __sanitizer_iovec) == sizeof(struct iovec)); +COMPILER_CHECK(offsetof(struct __sanitizer_iovec, iov_base) == + offsetof(struct iovec, iov_base)); +COMPILER_CHECK(offsetof(struct __sanitizer_iovec, iov_len) == + offsetof(struct iovec, iov_len)); + +COMPILER_CHECK(sizeof(struct __sanitizer_msghdr) == sizeof(struct msghdr)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_name) == + offsetof(struct msghdr, msg_name)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_namelen) == + offsetof(struct msghdr, msg_namelen)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_iov) == + offsetof(struct msghdr, msg_iov)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_iovlen) == + offsetof(struct msghdr, msg_iovlen)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_control) == + offsetof(struct msghdr, msg_control)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_controllen) == + offsetof(struct msghdr, msg_controllen)); +COMPILER_CHECK(offsetof(struct __sanitizer_msghdr, msg_flags) == + offsetof(struct msghdr, msg_flags)); + +COMPILER_CHECK(sizeof(struct __sanitizer_cmsghdr) == sizeof(struct cmsghdr)); +COMPILER_CHECK(offsetof(struct __sanitizer_cmsghdr, cmsg_len) == + offsetof(struct cmsghdr, cmsg_len)); +COMPILER_CHECK(offsetof(struct __sanitizer_cmsghdr, cmsg_level) == + offsetof(struct cmsghdr, cmsg_level)); +COMPILER_CHECK(offsetof(struct __sanitizer_cmsghdr, cmsg_type) == + offsetof(struct cmsghdr, cmsg_type)); + #endif // SANITIZER_LINUX || SANITIZER_MAC diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h index 37581953db2..c5cae881c8b 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -49,10 +49,26 @@ namespace __sanitizer { extern unsigned struct_statfs64_sz; #endif // SANITIZER_LINUX && !SANITIZER_ANDROID - void* __sanitizer_get_msghdr_iov_iov_base(void* msg, int idx); - uptr __sanitizer_get_msghdr_iov_iov_len(void* msg, int idx); - uptr __sanitizer_get_msghdr_iovlen(void* msg); - uptr __sanitizer_get_socklen_t(void* socklen_ptr); + struct __sanitizer_iovec { + void *iov_base; + uptr iov_len; + }; + + struct __sanitizer_msghdr { + void *msg_name; + unsigned msg_namelen; + struct __sanitizer_iovec *msg_iov; + uptr msg_iovlen; + void *msg_control; + uptr msg_controllen; + int msg_flags; + }; + + struct __sanitizer_cmsghdr { + uptr cmsg_len; + int cmsg_level; + int cmsg_type; + }; // This thing depends on the platform. We are only interested in the upper // limit. Verified with a compiler assert in .cc. diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc index 60a5412fede..8b05c7ccb0c 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc @@ -1509,15 +1509,6 @@ TSAN_INTERCEPTOR(long_t, recv, int fd, void *buf, long_t len, int flags) { return res; } -TSAN_INTERCEPTOR(long_t, recvmsg, int fd, void *msg, int flags) { - SCOPED_TSAN_INTERCEPTOR(recvmsg, fd, msg, flags); - int res = REAL(recvmsg)(fd, msg, flags); - if (res >= 0 && fd >= 0) { - FdAcquire(thr, pc, fd); - } - return res; -} - TSAN_INTERCEPTOR(int, unlink, char *path) { SCOPED_TSAN_INTERCEPTOR(unlink, path); Release(thr, pc, File2addr(path)); @@ -2063,7 +2054,6 @@ void InitializeInterceptors() { TSAN_INTERCEPT(send); TSAN_INTERCEPT(sendmsg); TSAN_INTERCEPT(recv); - TSAN_INTERCEPT(recvmsg); TSAN_INTERCEPT(unlink); TSAN_INTERCEPT(fopen); |

