[compiler-rt] r182843 - [sanitizer] Move TSan and MSan recvmsg interceptors to common.
Evgeniy Stepanov
eugeni.stepanov at gmail.com
Wed May 29 04:30:01 PDT 2013
Author: eugenis
Date: Wed May 29 06:30:00 2013
New Revision: 182843
URL: http://llvm.org/viewvc/llvm-project?rev=182843&view=rev
Log:
[sanitizer] Move TSan and MSan recvmsg interceptors to common.
Modified:
compiler-rt/trunk/lib/msan/msan_interceptors.cc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h
compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=182843&r1=182842&r2=182843&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Wed May 29 06:30:00 2013
@@ -710,33 +710,21 @@ INTERCEPTOR(SSIZE_T, recv, int fd, void
}
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);
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=182843&r1=182842&r2=182843&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Wed May 29 06:30:00 2013
@@ -1044,6 +1044,37 @@ INTERCEPTOR(long double, modfl, long dou
#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 dou
INIT_GETSOCKOPT; \
INIT_ACCEPT; \
INIT_ACCEPT4; \
- INIT_MODF;
+ INIT_MODF; \
+ INIT_RECVMSG;
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=182843&r1=182842&r2=182843&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h Wed May 29 06:30:00 2013
@@ -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
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cc?rev=182843&r1=182842&r2=182843&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.cc Wed May 29 06:30:00 2013
@@ -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 __sanitiz
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 __sanitiz
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
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h?rev=182843&r1=182842&r2=182843&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_limits_posix.h Wed May 29 06:30:00 2013
@@ -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.
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=182843&r1=182842&r2=182843&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Wed May 29 06:30:00 2013
@@ -1509,15 +1509,6 @@ TSAN_INTERCEPTOR(long_t, recv, int fd, v
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);
More information about the llvm-commits
mailing list