[PATCH] Allow initialization of Asan interceptors before the general Asan initialization takes place on FreeBSD
Viktor Kutuzov
vkutuzov at accesssoftek.com
Mon Jul 14 07:55:30 PDT 2014
Hi kcc, samsonov,
http://reviews.llvm.org/D4496
Files:
lib/asan/asan_interceptors.cc
lib/asan/asan_internal.h
lib/asan/asan_rtl.cc
Index: lib/asan/asan_interceptors.cc
===================================================================
--- lib/asan/asan_interceptors.cc
+++ lib/asan/asan_interceptors.cc
@@ -117,13 +117,18 @@
#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size) \
ASAN_WRITE_RANGE(ptr, size)
#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) ASAN_READ_RANGE(ptr, size)
+// On FreeBSD intercepted function may be called before the references to the
+// real functions are initialized.
#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \
do { \
+ if (SANITIZER_FREEBSD && UNLIKELY(!asan_interceptors_inited)) \
+ InitializeAsanInterceptors(); \
if (asan_init_is_running) \
return REAL(func)(__VA_ARGS__); \
ctx = 0; \
(void) ctx; \
- if (SANITIZER_MAC && UNLIKELY(!asan_inited)) \
+ if ((SANITIZER_MAC != 0 || SANITIZER_FREEBSD != 0) && \
+ UNLIKELY(!asan_inited)) \
return REAL(func)(__VA_ARGS__); \
ENSURE_ASAN_INITED(); \
} while (false)
@@ -736,9 +741,8 @@
// ---------------------- InitializeAsanInterceptors ---------------- {{{1
namespace __asan {
void InitializeAsanInterceptors() {
- static bool was_called_once;
- CHECK(was_called_once == false);
- was_called_once = true;
+ if (asan_interceptors_inited) return;
+
InitializeCommonInterceptors();
// Intercept mem* functions.
@@ -827,6 +831,8 @@
InitializeWindowsInterceptors();
#endif
+ asan_interceptors_inited = true;
+
VReport(1, "AddressSanitizer: libc interceptors initialized\n");
}
Index: lib/asan/asan_internal.h
===================================================================
--- lib/asan/asan_internal.h
+++ lib/asan/asan_internal.h
@@ -123,6 +123,7 @@
extern int asan_inited;
// Used to avoid infinite recursion in __asan_init().
extern bool asan_init_is_running;
+extern bool asan_interceptors_inited;
extern void (*death_callback)(void);
// These magic values are written to shadow for better error reporting.
Index: lib/asan/asan_rtl.cc
===================================================================
--- lib/asan/asan_rtl.cc
+++ lib/asan/asan_rtl.cc
@@ -322,6 +322,7 @@
// -------------------------- Globals --------------------- {{{1
int asan_inited;
bool asan_init_is_running;
+bool asan_interceptors_inited;
void (*death_callback)(void);
#if !ASAN_FIXED_MAPPING
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4496.11384.patch
Type: text/x-patch
Size: 2916 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140714/d94a6c25/attachment.bin>
More information about the llvm-commits
mailing list