diff options
Diffstat (limited to 'lib/asan/asan_rtl.cc')
-rw-r--r-- | lib/asan/asan_rtl.cc | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc index 5a1128d6e..1d676bd0d 100644 --- a/lib/asan/asan_rtl.cc +++ b/lib/asan/asan_rtl.cc @@ -32,6 +32,7 @@ #include "ubsan/ubsan_init.h" #include "ubsan/ubsan_platform.h" +uptr __asan_shadow_memory_dynamic_address; // Global interface symbol. int __asan_option_detect_stack_use_after_return; // Global interface symbol. uptr *__asan_test_only_reported_buggy_pointer; // Used only for testing asan. @@ -460,7 +461,20 @@ static void AsanInitInternal() { ReplaceSystemMalloc(); + __asan_shadow_memory_dynamic_address = 0; uptr shadow_start = kLowShadowBeg; + if (shadow_start == 0) { + uptr granularity = GetMmapGranularity(); + uptr alignment = 8 * granularity; + uptr left_padding = granularity; + uptr space_size = kHighShadowEnd + left_padding; + + shadow_start = FindAvailableMemoryRange(space_size, alignment, granularity); + CHECK_NE((uptr)0, shadow_start); + CHECK(IsAligned(shadow_start, alignment)); + } + __asan_shadow_memory_dynamic_address = shadow_start; + if (kLowShadowBeg) shadow_start -= GetMmapGranularity(); bool full_shadow_is_available = @@ -472,12 +486,6 @@ static void AsanInitInternal() { kMidMemBeg = kLowMemEnd < 0x3000000000ULL ? 0x3000000000ULL : 0; kMidMemEnd = kLowMemEnd < 0x3000000000ULL ? 0x4fffffffffULL : 0; } -#elif SANITIZER_WINDOWS64 - // Disable the "mid mem" shadow layout. - if (!full_shadow_is_available) { - kMidMemBeg = 0; - kMidMemEnd = 0; - } #endif if (Verbosity()) PrintAddressSpaceLayout(); @@ -650,6 +658,14 @@ void __asan_init() { AsanInitInternal(); } +// Called by a loaded DLL to initialize itself. +void __asan_init_from_dll(int *detect_stack_use_after_return, + uptr *shadow_memory_dynamic_address) { + __asan_init(); + *detect_stack_use_after_return = __asan_option_detect_stack_use_after_return; + *shadow_memory_dynamic_address = __asan_shadow_memory_dynamic_address; +} + void __asan_version_mismatch_check() { // Do nothing. } |