aboutsummaryrefslogtreecommitdiff
path: root/lib/asan
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-06-10 13:44:32 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-06-10 13:44:32 +0000
commit7edd24de96f22ad70fd3ca16a3c51723383cd58b (patch)
tree1bd9c96401fc2098358ab3ab9f14255e2eabd1ac /lib/asan
parent25091d6bd042c6bf2709eaab2bd1a88f3f2d9fda (diff)
downloadsrc-7edd24de96f22ad70fd3ca16a3c51723383cd58b.tar.gz
src-7edd24de96f22ad70fd3ca16a3c51723383cd58b.zip
Vendor import of compiler-rt trunk r305145:vendor/compiler-rt/compiler-rt-trunk-r305145
Notes
Notes: svn path=/vendor/compiler-rt/dist/; revision=319784 svn path=/vendor/compiler-rt/compiler-rt-trunk-r305145/; revision=319785; tag=vendor/compiler-rt/compiler-rt-trunk-r305145
Diffstat (limited to 'lib/asan')
-rw-r--r--lib/asan/asan_allocator.cc4
-rw-r--r--lib/asan/asan_allocator.h2
-rw-r--r--lib/asan/asan_interceptors.cc17
-rw-r--r--lib/asan/asan_malloc_linux.cc22
4 files changed, 17 insertions, 28 deletions
diff --git a/lib/asan/asan_allocator.cc b/lib/asan/asan_allocator.cc
index db5a683e283d..7010b6023614 100644
--- a/lib/asan/asan_allocator.cc
+++ b/lib/asan/asan_allocator.cc
@@ -47,6 +47,8 @@ static u32 RZSize2Log(u32 rz_size) {
return res;
}
+static AsanAllocator &get_allocator();
+
// The memory chunk allocated from the underlying allocator looks like this:
// L L L L L L H H U U U U U U R R
// L -- left redzone words (0 or more bytes)
@@ -717,7 +719,7 @@ struct Allocator {
static Allocator instance(LINKER_INITIALIZED);
-AsanAllocator &get_allocator() {
+static AsanAllocator &get_allocator() {
return instance.allocator;
}
diff --git a/lib/asan/asan_allocator.h b/lib/asan/asan_allocator.h
index ce3e25dc5094..ad1aeb58a86b 100644
--- a/lib/asan/asan_allocator.h
+++ b/lib/asan/asan_allocator.h
@@ -213,7 +213,5 @@ void asan_mz_force_unlock();
void PrintInternalAllocatorStats();
void AsanSoftRssLimitExceededCallback(bool exceeded);
-AsanAllocator &get_allocator();
-
} // namespace __asan
#endif // ASAN_ALLOCATOR_H
diff --git a/lib/asan/asan_interceptors.cc b/lib/asan/asan_interceptors.cc
index 4682fba3392c..264d5aee8ceb 100644
--- a/lib/asan/asan_interceptors.cc
+++ b/lib/asan/asan_interceptors.cc
@@ -22,7 +22,6 @@
#include "asan_stats.h"
#include "asan_suppressions.h"
#include "lsan/lsan_common.h"
-#include "sanitizer_common/sanitizer_stackdepot.h"
#include "sanitizer_common/sanitizer_libc.h"
#if SANITIZER_POSIX
@@ -705,25 +704,9 @@ INTERCEPTOR(int, __cxa_atexit, void (*func)(void *), void *arg,
#endif // ASAN_INTERCEPT___CXA_ATEXIT
#if ASAN_INTERCEPT_FORK
-static void BeforeFork() {
- if (SANITIZER_LINUX) {
- get_allocator().ForceLock();
- StackDepotLockAll();
- }
-}
-
-static void AfterFork() {
- if (SANITIZER_LINUX) {
- StackDepotUnlockAll();
- get_allocator().ForceUnlock();
- }
-}
-
INTERCEPTOR(int, fork, void) {
ENSURE_ASAN_INITED();
- BeforeFork();
int pid = REAL(fork)();
- AfterFork();
return pid;
}
#endif // ASAN_INTERCEPT_FORK
diff --git a/lib/asan/asan_malloc_linux.cc b/lib/asan/asan_malloc_linux.cc
index 8c99d3bc9257..fd40f47db1c4 100644
--- a/lib/asan/asan_malloc_linux.cc
+++ b/lib/asan/asan_malloc_linux.cc
@@ -60,36 +60,42 @@ INTERCEPTOR(void, cfree, void *ptr) {
#endif // SANITIZER_INTERCEPT_CFREE
INTERCEPTOR(void*, malloc, uptr size) {
- if (UNLIKELY(!asan_inited))
+ if (UNLIKELY(asan_init_is_running))
// Hack: dlsym calls malloc before REAL(malloc) is retrieved from dlsym.
return AllocateFromLocalPool(size);
+ ENSURE_ASAN_INITED();
GET_STACK_TRACE_MALLOC;
return asan_malloc(size, &stack);
}
INTERCEPTOR(void*, calloc, uptr nmemb, uptr size) {
- if (UNLIKELY(!asan_inited))
+ if (UNLIKELY(asan_init_is_running))
// Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.
return AllocateFromLocalPool(nmemb * size);
+ ENSURE_ASAN_INITED();
GET_STACK_TRACE_MALLOC;
return asan_calloc(nmemb, size, &stack);
}
INTERCEPTOR(void*, realloc, void *ptr, uptr size) {
- GET_STACK_TRACE_MALLOC;
if (UNLIKELY(IsInDlsymAllocPool(ptr))) {
- uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
- uptr copy_size = Min(size, kDlsymAllocPoolSize - offset);
+ const uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
+ const uptr copy_size = Min(size, kDlsymAllocPoolSize - offset);
void *new_ptr;
- if (UNLIKELY(!asan_inited)) {
+ if (UNLIKELY(asan_init_is_running)) {
new_ptr = AllocateFromLocalPool(size);
} else {
- copy_size = size;
- new_ptr = asan_malloc(copy_size, &stack);
+ ENSURE_ASAN_INITED();
+ GET_STACK_TRACE_MALLOC;
+ new_ptr = asan_malloc(size, &stack);
}
internal_memcpy(new_ptr, ptr, copy_size);
return new_ptr;
}
+ if (UNLIKELY(asan_init_is_running))
+ return AllocateFromLocalPool(size);
+ ENSURE_ASAN_INITED();
+ GET_STACK_TRACE_MALLOC;
return asan_realloc(ptr, size, &stack);
}