[NFC][asan] Change asan_init and asan_init_is_running; add setters/getters
For #71833
This commit is contained in:
parent
08771c4e0e
commit
5d6304f017
@ -527,7 +527,7 @@ struct Allocator {
|
||||
// -------------------- Allocation/Deallocation routines ---------------
|
||||
void *Allocate(uptr size, uptr alignment, BufferedStackTrace *stack,
|
||||
AllocType alloc_type, bool can_fill) {
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
AsanInitFromRtl();
|
||||
if (UNLIKELY(IsRssLimitExceeded())) {
|
||||
if (AllocatorMayReturnNull())
|
||||
|
||||
@ -196,7 +196,7 @@ static inline bool UseODRIndicator(const Global *g) {
|
||||
// This function may be called more than once for every global
|
||||
// so we store the globals in a map.
|
||||
static void RegisterGlobal(const Global *g) {
|
||||
CHECK(asan_inited);
|
||||
CHECK(AsanInited());
|
||||
if (flags()->report_globals >= 2)
|
||||
ReportGlobal(*g, "Added");
|
||||
CHECK(flags()->report_globals);
|
||||
@ -237,7 +237,7 @@ static void RegisterGlobal(const Global *g) {
|
||||
}
|
||||
|
||||
static void UnregisterGlobal(const Global *g) {
|
||||
CHECK(asan_inited);
|
||||
CHECK(AsanInited());
|
||||
if (flags()->report_globals >= 2)
|
||||
ReportGlobal(*g, "Removed");
|
||||
CHECK(flags()->report_globals);
|
||||
@ -427,7 +427,7 @@ void __asan_before_dynamic_init(const char *module_name) {
|
||||
return;
|
||||
bool strict_init_order = flags()->strict_init_order;
|
||||
CHECK(module_name);
|
||||
CHECK(asan_inited);
|
||||
CHECK(AsanInited());
|
||||
Lock lock(&mu_for_globals);
|
||||
if (flags()->report_globals >= 3)
|
||||
Printf("DynInitPoison module: %s\n", module_name);
|
||||
@ -451,7 +451,7 @@ void __asan_after_dynamic_init() {
|
||||
!CanPoisonMemory() ||
|
||||
!dynamic_init_globals)
|
||||
return;
|
||||
CHECK(asan_inited);
|
||||
CHECK(AsanInited());
|
||||
Lock lock(&mu_for_globals);
|
||||
// FIXME: Optionally report that we're unpoisoning globals from a module.
|
||||
for (uptr i = 0, n = dynamic_init_globals->size(); i < n; ++i) {
|
||||
|
||||
@ -96,14 +96,14 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
|
||||
ASAN_WRITE_RANGE(ctx, ptr, size)
|
||||
#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size) \
|
||||
ASAN_READ_RANGE(ctx, ptr, size)
|
||||
# define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, func); \
|
||||
do { \
|
||||
if (asan_init_is_running) \
|
||||
return REAL(func)(__VA_ARGS__); \
|
||||
if (SANITIZER_APPLE && UNLIKELY(!asan_inited)) \
|
||||
return REAL(func)(__VA_ARGS__); \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
# define COMMON_INTERCEPTOR_ENTER(ctx, func, ...) \
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, func); \
|
||||
do { \
|
||||
if (AsanInitIsRunning()) \
|
||||
return REAL(func)(__VA_ARGS__); \
|
||||
if (SANITIZER_APPLE && UNLIKELY(!AsanInited())) \
|
||||
return REAL(func)(__VA_ARGS__); \
|
||||
ENSURE_ASAN_INITED(); \
|
||||
} while (false)
|
||||
#define COMMON_INTERCEPTOR_DIR_ACQUIRE(ctx, path) \
|
||||
do { \
|
||||
@ -138,7 +138,7 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
|
||||
# define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit()
|
||||
# define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, handle)
|
||||
# define COMMON_INTERCEPTOR_LIBRARY_UNLOADED()
|
||||
# define COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED (!asan_inited)
|
||||
# define COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED (!AsanInited())
|
||||
# define COMMON_INTERCEPTOR_GET_TLS_RANGE(begin, end) \
|
||||
if (AsanThread *t = GetCurrentThread()) { \
|
||||
*begin = t->tls_begin(); \
|
||||
@ -535,12 +535,12 @@ INTERCEPTOR(char *, strcpy, char *to, const char *from) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, strcpy);
|
||||
#if SANITIZER_APPLE
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return REAL(strcpy)(to, from);
|
||||
#endif
|
||||
// strcpy is called from malloc_default_purgeable_zone()
|
||||
// in __asan::ReplaceSystemAlloc() on Mac.
|
||||
if (asan_init_is_running) {
|
||||
if (AsanInitIsRunning()) {
|
||||
return REAL(strcpy)(to, from);
|
||||
}
|
||||
ENSURE_ASAN_INITED();
|
||||
@ -556,7 +556,7 @@ INTERCEPTOR(char *, strcpy, char *to, const char *from) {
|
||||
INTERCEPTOR(char*, strdup, const char *s) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, strdup);
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return internal_strdup(s);
|
||||
ENSURE_ASAN_INITED();
|
||||
uptr length = internal_strlen(s);
|
||||
@ -575,7 +575,7 @@ INTERCEPTOR(char*, strdup, const char *s) {
|
||||
INTERCEPTOR(char*, __strdup, const char *s) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, strdup);
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return internal_strdup(s);
|
||||
ENSURE_ASAN_INITED();
|
||||
uptr length = internal_strlen(s);
|
||||
@ -636,7 +636,7 @@ INTERCEPTOR(int, atoi, const char *nptr) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, atoi);
|
||||
#if SANITIZER_APPLE
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return REAL(atoi)(nptr);
|
||||
# endif
|
||||
ENSURE_ASAN_INITED();
|
||||
@ -658,7 +658,7 @@ INTERCEPTOR(long, atol, const char *nptr) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, atol);
|
||||
#if SANITIZER_APPLE
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return REAL(atol)(nptr);
|
||||
# endif
|
||||
ENSURE_ASAN_INITED();
|
||||
@ -697,7 +697,7 @@ static void AtCxaAtexit(void *unused) {
|
||||
INTERCEPTOR(int, __cxa_atexit, void (*func)(void *), void *arg,
|
||||
void *dso_handle) {
|
||||
#if SANITIZER_APPLE
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return REAL(__cxa_atexit)(func, arg, dso_handle);
|
||||
# endif
|
||||
ENSURE_ASAN_INITED();
|
||||
|
||||
@ -24,12 +24,12 @@ namespace __asan {
|
||||
void InitializeAsanInterceptors();
|
||||
void InitializePlatformInterceptors();
|
||||
|
||||
#define ENSURE_ASAN_INITED() \
|
||||
do { \
|
||||
CHECK(!asan_init_is_running); \
|
||||
if (UNLIKELY(!asan_inited)) { \
|
||||
AsanInitFromRtl(); \
|
||||
} \
|
||||
#define ENSURE_ASAN_INITED() \
|
||||
do { \
|
||||
CHECK(!AsanInitIsRunning()); \
|
||||
if (UNLIKELY(!AsanInited())) { \
|
||||
AsanInitFromRtl(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
} // namespace __asan
|
||||
|
||||
@ -33,7 +33,7 @@ using namespace __asan;
|
||||
} \
|
||||
ASAN_READ_RANGE(ctx, from, size); \
|
||||
ASAN_WRITE_RANGE(ctx, to, size); \
|
||||
} else if (UNLIKELY(!asan_inited)) { \
|
||||
} else if (UNLIKELY(!AsanInited())) { \
|
||||
return internal_memcpy(to, from, size); \
|
||||
} \
|
||||
return REAL(memcpy)(to, from, size); \
|
||||
@ -44,7 +44,7 @@ using namespace __asan;
|
||||
do { \
|
||||
if (LIKELY(replace_intrin_cached)) { \
|
||||
ASAN_WRITE_RANGE(ctx, block, size); \
|
||||
} else if (UNLIKELY(!asan_inited)) { \
|
||||
} else if (UNLIKELY(!AsanInited())) { \
|
||||
return internal_memset(block, c, size); \
|
||||
} \
|
||||
return REAL(memset)(block, c, size); \
|
||||
|
||||
@ -130,9 +130,8 @@ void InstallAtExitCheckLeaks();
|
||||
if (&__asan_on_error) \
|
||||
__asan_on_error()
|
||||
|
||||
extern int asan_inited;
|
||||
// Used to avoid infinite recursion in __asan_init().
|
||||
extern bool asan_init_is_running;
|
||||
bool AsanInited();
|
||||
bool AsanInitIsRunning(); // Used to avoid infinite recursion in __asan_init().
|
||||
extern bool replace_intrin_cached;
|
||||
extern void (*death_callback)(void);
|
||||
// These magic values are written to shadow for better error
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
using namespace __asan;
|
||||
|
||||
struct DlsymAlloc : public DlSymAllocator<DlsymAlloc> {
|
||||
static bool UseImpl() { return asan_init_is_running; }
|
||||
static bool UseImpl() { return AsanInitIsRunning(); }
|
||||
static void OnAllocate(const void *ptr, uptr size) {
|
||||
# if CAN_SANITIZE_LEAKS
|
||||
// Suppress leaks from dlerror(). Previously dlsym hack on global array was
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
using namespace __asan;
|
||||
#define COMMON_MALLOC_ZONE_NAME "asan"
|
||||
#define COMMON_MALLOC_ENTER() ENSURE_ASAN_INITED()
|
||||
# define COMMON_MALLOC_SANITIZER_INITIALIZED asan_inited
|
||||
# define COMMON_MALLOC_SANITIZER_INITIALIZED AsanInited()
|
||||
# define COMMON_MALLOC_FORCE_LOCK() asan_mz_force_lock()
|
||||
# define COMMON_MALLOC_FORCE_UNLOCK() asan_mz_force_unlock()
|
||||
# define COMMON_MALLOC_MEMALIGN(alignment, size) \
|
||||
|
||||
@ -211,7 +211,7 @@ INTERCEPTOR_WINAPI(size_t, HeapSize, HANDLE hHeap, DWORD dwFlags,
|
||||
// interception takes place, so if it is not owned by the RTL heap we can
|
||||
// pass it to the ASAN heap for inspection.
|
||||
if (flags()->windows_hook_rtl_allocators) {
|
||||
if (!asan_inited || OWNED_BY_RTL(hHeap, lpMem))
|
||||
if (!AsanInited() || OWNED_BY_RTL(hHeap, lpMem))
|
||||
return REAL(HeapSize)(hHeap, dwFlags, lpMem);
|
||||
} else {
|
||||
CHECK(dwFlags == 0 && "unsupported heap flags");
|
||||
@ -226,7 +226,7 @@ INTERCEPTOR_WINAPI(LPVOID, HeapAlloc, HANDLE hHeap, DWORD dwFlags,
|
||||
// If the ASAN runtime is not initialized, or we encounter an unsupported
|
||||
// flag, fall back to the original allocator.
|
||||
if (flags()->windows_hook_rtl_allocators) {
|
||||
if (UNLIKELY(!asan_inited ||
|
||||
if (UNLIKELY(!AsanInited() ||
|
||||
(dwFlags & HEAP_ALLOCATE_UNSUPPORTED_FLAGS) != 0)) {
|
||||
return REAL(HeapAlloc)(hHeap, dwFlags, dwBytes);
|
||||
}
|
||||
@ -297,7 +297,7 @@ void *SharedReAlloc(ReAllocFunction reallocFunc, SizeFunction heapSizeFunc,
|
||||
|
||||
// If this heap block which was allocated before the ASAN
|
||||
// runtime came up, use the real HeapFree function.
|
||||
if (UNLIKELY(!asan_inited)) {
|
||||
if (UNLIKELY(!AsanInited())) {
|
||||
return reallocFunc(hHeap, dwFlags, lpMem, dwBytes);
|
||||
}
|
||||
bool only_asan_supported_flags =
|
||||
@ -420,7 +420,7 @@ size_t RtlSizeHeap(void* HeapHandle, DWORD Flags, void* BaseAddress);
|
||||
INTERCEPTOR_WINAPI(size_t, RtlSizeHeap, HANDLE HeapHandle, DWORD Flags,
|
||||
void* BaseAddress) {
|
||||
if (!flags()->windows_hook_rtl_allocators ||
|
||||
UNLIKELY(!asan_inited || OWNED_BY_RTL(HeapHandle, BaseAddress))) {
|
||||
UNLIKELY(!AsanInited() || OWNED_BY_RTL(HeapHandle, BaseAddress))) {
|
||||
return REAL(RtlSizeHeap)(HeapHandle, Flags, BaseAddress);
|
||||
}
|
||||
GET_CURRENT_PC_BP_SP;
|
||||
@ -448,7 +448,7 @@ INTERCEPTOR_WINAPI(void*, RtlAllocateHeap, HANDLE HeapHandle, DWORD Flags,
|
||||
// If the ASAN runtime is not initialized, or we encounter an unsupported
|
||||
// flag, fall back to the original allocator.
|
||||
if (!flags()->windows_hook_rtl_allocators ||
|
||||
UNLIKELY(!asan_inited ||
|
||||
UNLIKELY(!AsanInited() ||
|
||||
(Flags & HEAP_ALLOCATE_UNSUPPORTED_FLAGS) != 0)) {
|
||||
return REAL(RtlAllocateHeap)(HeapHandle, Flags, Size);
|
||||
}
|
||||
|
||||
@ -71,8 +71,17 @@ static void CheckUnwind() {
|
||||
}
|
||||
|
||||
// -------------------------- Globals --------------------- {{{1
|
||||
int asan_inited;
|
||||
bool asan_init_is_running;
|
||||
static int asan_inited = 0;
|
||||
static int asan_init_is_running = 0;
|
||||
|
||||
void SetAsanInited(u32 val) { asan_inited = val; }
|
||||
|
||||
void SetAsanInitIsRunning(u32 val) { asan_init_is_running = val; }
|
||||
|
||||
bool AsanInited() { return asan_inited == 1; }
|
||||
|
||||
bool AsanInitIsRunning() { return asan_init_is_running == 1; }
|
||||
|
||||
bool replace_intrin_cached;
|
||||
|
||||
#if !ASAN_FIXED_MAPPING
|
||||
@ -382,11 +391,11 @@ void PrintAddressSpaceLayout() {
|
||||
}
|
||||
|
||||
static void AsanInitInternal() {
|
||||
if (LIKELY(asan_inited))
|
||||
if (LIKELY(AsanInited()))
|
||||
return;
|
||||
SanitizerToolName = "AddressSanitizer";
|
||||
CHECK(!asan_init_is_running && "ASan init calls itself!");
|
||||
asan_init_is_running = true;
|
||||
CHECK(!AsanInitIsRunning() && "ASan init calls itself!");
|
||||
SetAsanInitIsRunning(1);
|
||||
|
||||
CacheBinaryName();
|
||||
|
||||
@ -399,7 +408,7 @@ static void AsanInitInternal() {
|
||||
// Stop performing init at this point if we are being loaded via
|
||||
// dlopen() and the platform supports it.
|
||||
if (SANITIZER_SUPPORTS_INIT_FOR_DLOPEN && UNLIKELY(HandleDlopenInit())) {
|
||||
asan_init_is_running = false;
|
||||
SetAsanInitIsRunning(0);
|
||||
VReport(1, "AddressSanitizer init is being performed for dlopen().\n");
|
||||
return;
|
||||
}
|
||||
@ -461,8 +470,8 @@ static void AsanInitInternal() {
|
||||
// On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited
|
||||
// should be set to 1 prior to initializing the threads.
|
||||
replace_intrin_cached = flags()->replace_intrin;
|
||||
asan_inited = 1;
|
||||
asan_init_is_running = false;
|
||||
SetAsanInited(1);
|
||||
SetAsanInitIsRunning(0);
|
||||
|
||||
if (flags()->atexit)
|
||||
Atexit(asan_atexit);
|
||||
@ -584,7 +593,7 @@ static void UnpoisonFakeStack() {
|
||||
using namespace __asan;
|
||||
|
||||
void NOINLINE __asan_handle_no_return() {
|
||||
if (asan_init_is_running)
|
||||
if (AsanInitIsRunning())
|
||||
return;
|
||||
|
||||
if (!PlatformUnpoisonStacks())
|
||||
|
||||
@ -57,7 +57,7 @@ void __sanitizer::BufferedStackTrace::UnwindImpl(
|
||||
uptr pc, uptr bp, void *context, bool request_fast, u32 max_depth) {
|
||||
using namespace __asan;
|
||||
size = 0;
|
||||
if (UNLIKELY(!asan_inited))
|
||||
if (UNLIKELY(!AsanInited()))
|
||||
return;
|
||||
request_fast = StackTrace::WillUseFastUnwind(request_fast);
|
||||
AsanThread *t = GetCurrentThread();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user