forked from OSchip/llvm-project
[sanitizer] move mlock interceptor from asan/tsan/msan to common; no functionality change intended
llvm-svn: 216407
This commit is contained in:
parent
0562524b45
commit
74bd6bc9f9
|
|
@ -320,40 +320,6 @@ INTERCEPTOR(int, _except_handler4, void *a, void *b, void *c, void *d) {
|
|||
}
|
||||
#endif
|
||||
|
||||
#if ASAN_INTERCEPT_MLOCKX
|
||||
// intercept mlock and friends.
|
||||
// Since asan maps 16T of RAM, mlock is completely unfriendly to asan.
|
||||
// All functions return 0 (success).
|
||||
static void MlockIsUnsupported() {
|
||||
static bool printed = false;
|
||||
if (printed) return;
|
||||
printed = true;
|
||||
VPrintf(1,
|
||||
"INFO: AddressSanitizer ignores "
|
||||
"mlock/mlockall/munlock/munlockall\n");
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, mlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, munlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, mlockall, int flags) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, munlockall, void) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int CharCmp(unsigned char c1, unsigned char c2) {
|
||||
return (c1 == c2) ? 0 : (c1 < c2) ? -1 : 1;
|
||||
}
|
||||
|
|
@ -803,14 +769,6 @@ void InitializeAsanInterceptors() {
|
|||
ASAN_INTERCEPT_FUNC(strtoll);
|
||||
#endif
|
||||
|
||||
#if ASAN_INTERCEPT_MLOCKX
|
||||
// Intercept mlock/munlock.
|
||||
ASAN_INTERCEPT_FUNC(mlock);
|
||||
ASAN_INTERCEPT_FUNC(munlock);
|
||||
ASAN_INTERCEPT_FUNC(mlockall);
|
||||
ASAN_INTERCEPT_FUNC(munlockall);
|
||||
#endif
|
||||
|
||||
// Intecept signal- and jump-related functions.
|
||||
ASAN_INTERCEPT_FUNC(longjmp);
|
||||
#if ASAN_INTERCEPT_SIGNAL_AND_SIGACTION
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
# define ASAN_INTERCEPT_STRDUP 1
|
||||
# define ASAN_INTERCEPT_INDEX 1
|
||||
# define ASAN_INTERCEPT_PTHREAD_CREATE 1
|
||||
# define ASAN_INTERCEPT_MLOCKX 1
|
||||
# define ASAN_INTERCEPT_FORK 1
|
||||
#else
|
||||
# define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 0
|
||||
|
|
@ -34,7 +33,6 @@
|
|||
# define ASAN_INTERCEPT_STRDUP 0
|
||||
# define ASAN_INTERCEPT_INDEX 0
|
||||
# define ASAN_INTERCEPT_PTHREAD_CREATE 0
|
||||
# define ASAN_INTERCEPT_MLOCKX 0
|
||||
# define ASAN_INTERCEPT_FORK 0
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1148,36 +1148,6 @@ INTERCEPTOR(void *, shmat, int shmid, const void *shmaddr, int shmflg) {
|
|||
return p;
|
||||
}
|
||||
|
||||
// Linux kernel has a bug that leads to kernel deadlock if a process
|
||||
// maps TBs of memory and then calls mlock().
|
||||
static void MlockIsUnsupported() {
|
||||
static atomic_uint8_t printed;
|
||||
if (atomic_exchange(&printed, 1, memory_order_relaxed))
|
||||
return;
|
||||
VPrintf(1,
|
||||
"INFO: MemorySanitizer ignores mlock/mlockall/munlock/munlockall\n");
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, mlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, munlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, mlockall, int flags) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, munlockall, void) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct MSanInterceptorContext {
|
||||
bool in_interceptor_scope;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -4685,6 +4685,47 @@ INTERCEPTOR(int, timerfd_gettime, int fd, void *curr_value) {
|
|||
#define INIT_TIMERFD
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_MLOCKX
|
||||
// Linux kernel has a bug that leads to kernel deadlock if a process
|
||||
// maps TBs of memory and then calls mlock().
|
||||
static void MlockIsUnsupported() {
|
||||
static atomic_uint8_t printed;
|
||||
if (atomic_exchange(&printed, 1, memory_order_relaxed))
|
||||
return;
|
||||
VPrintf(1, "INFO: %s ignores mlock/mlockall/munlock/munlockall\n",
|
||||
SanitizerToolName);
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, mlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, munlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, mlockall, int flags) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, munlockall, void) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define INIT_MLOCKX \
|
||||
COMMON_INTERCEPT_FUNCTION(mlock); \
|
||||
COMMON_INTERCEPT_FUNCTION(munlock); \
|
||||
COMMON_INTERCEPT_FUNCTION(mlockall); \
|
||||
COMMON_INTERCEPT_FUNCTION(munlockall);
|
||||
|
||||
#else
|
||||
#define INIT_MLOCKX
|
||||
#endif // SANITIZER_INTERCEPT_MLOCKX
|
||||
|
||||
static void InitializeCommonInterceptors() {
|
||||
static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
|
||||
interceptor_metadata_map = new((void *)&metadata_mem) MetadataHashMap();
|
||||
|
|
@ -4845,4 +4886,5 @@ static void InitializeCommonInterceptors() {
|
|||
INIT_DLOPEN_DLCLOSE;
|
||||
INIT_GETPASS;
|
||||
INIT_TIMERFD;
|
||||
INIT_MLOCKX;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -225,4 +225,6 @@
|
|||
#define SANITIZER_INTERCEPT_GETPASS SI_LINUX_NOT_ANDROID || SI_MAC
|
||||
#define SANITIZER_INTERCEPT_TIMERFD SI_LINUX_NOT_ANDROID
|
||||
|
||||
#define SANITIZER_INTERCEPT_MLOCKX SI_NOT_WINDOWS
|
||||
|
||||
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
|
||||
|
|
|
|||
|
|
@ -1905,35 +1905,6 @@ TSAN_INTERCEPTOR(int, getaddrinfo, void *node, void *service,
|
|||
return res;
|
||||
}
|
||||
|
||||
// Linux kernel has a bug that leads to kernel deadlock if a process
|
||||
// maps TBs of memory and then calls mlock().
|
||||
static void MlockIsUnsupported() {
|
||||
static atomic_uint8_t printed;
|
||||
if (atomic_exchange(&printed, 1, memory_order_relaxed))
|
||||
return;
|
||||
VPrintf(1, "INFO: ThreadSanitizer ignores mlock/munlock[all]\n");
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, mlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, munlock, const void *addr, uptr len) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, mlockall, int flags) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, munlockall, void) {
|
||||
MlockIsUnsupported();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, fork, int fake) {
|
||||
if (cur_thread()->in_symbolizer)
|
||||
return REAL(fork)(fake);
|
||||
|
|
@ -2373,11 +2344,6 @@ void InitializeInterceptors() {
|
|||
TSAN_INTERCEPT(gettimeofday);
|
||||
TSAN_INTERCEPT(getaddrinfo);
|
||||
|
||||
TSAN_INTERCEPT(mlock);
|
||||
TSAN_INTERCEPT(munlock);
|
||||
TSAN_INTERCEPT(mlockall);
|
||||
TSAN_INTERCEPT(munlockall);
|
||||
|
||||
TSAN_INTERCEPT(fork);
|
||||
TSAN_INTERCEPT(vfork);
|
||||
TSAN_INTERCEPT(on_exit);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
// RUN: %clang %s -o %t && %run %t
|
||||
// XFAIL: lsan
|
||||
|
||||
#include <assert.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
int main() {
|
||||
assert(0 == mlockall(MCL_CURRENT));
|
||||
assert(0 == mlock((void *)0x12345, 0x5678));
|
||||
assert(0 == munlockall());
|
||||
assert(0 == munlock((void *)0x987, 0x654));
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue