Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/compiler-rt/lib/asan/asan_linux.cc b/compiler-rt/lib/asan/asan_linux.cc
- index 8ce4b96c26e..5cf466661f0 100644
- --- a/compiler-rt/lib/asan/asan_linux.cc
- +++ b/compiler-rt/lib/asan/asan_linux.cc
- @@ -82,15 +82,27 @@ void *AsanDoesNotSupportStaticLinkage() {
- return &_DYNAMIC; // defined in link.h
- }
- +static void UnmapFromTo(uptr from, uptr to) {
- + CHECK(to >= from);
- + if (to == from) return;
- + uptr res = internal_munmap(reinterpret_cast<void *>(from), to - from);
- + if (UNLIKELY(internal_iserror(res))) {
- + Report(
- + "ERROR: AddresSanitizer failed to unmap 0x%zx (%zd) bytes at address "
- + "%p\n",
- + to - from, to - from, from);
- + CHECK("unable to unmap" && 0);
- + }
- +}
- +
- #if ASAN_PREMAP_SHADOW
- uptr FindPremappedShadowStart() {
- uptr granularity = GetMmapGranularity();
- uptr shadow_start = reinterpret_cast<uptr>(&__asan_shadow);
- - uptr shadow_size = PremapShadowSize();
- - UnmapOrDie((void *)(shadow_start - granularity), shadow_size + granularity);
- - // MmapNoAccess does not touch TotalMmap, but UnmapOrDie decreases it.
- - // Compensate.
- - IncreaseTotalMmap(shadow_size + granularity);
- + uptr premap_shadow_size = PremapShadowSize();
- + uptr shadow_size = RoundUpTo(kHighShadowEnd, granularity);
- + // We may have mapped too much. Release extra memory.
- + UnmapFromTo(shadow_start + shadow_size, shadow_start + premap_shadow_size);
- return shadow_start;
- }
- #endif
- @@ -104,17 +116,15 @@ uptr FindDynamicShadowStart() {
- uptr granularity = GetMmapGranularity();
- uptr alignment = granularity * 8;
- uptr left_padding = granularity;
- - uptr shadow_size = kHighShadowEnd + left_padding;
- - uptr map_size = shadow_size + alignment;
- + uptr shadow_size = RoundUpTo(kHighShadowEnd, granularity);
- + uptr map_size = shadow_size + left_padding + alignment;
- uptr map_start = (uptr)MmapNoAccess(map_size);
- CHECK_NE(map_start, ~(uptr)0);
- - uptr shadow_start = RoundUpTo(map_start, alignment);
- - UnmapOrDie((void *)map_start, map_size);
- - // MmapNoAccess does not touch TotalMmap, but UnmapOrDie decreases it.
- - // Compensate.
- - IncreaseTotalMmap(map_size);
- + uptr shadow_start = RoundUpTo(map_start + left_padding, alignment);
- + UnmapFromTo(map_start, shadow_start - left_padding);
- + UnmapFromTo(shadow_start + shadow_size, map_start + map_size);
- return shadow_start;
- }
- diff --git a/compiler-rt/lib/asan/asan_shadow_setup.cc b/compiler-rt/lib/asan/asan_shadow_setup.cc
- index 08c009184f8..b3cf0b5c1ce 100644
- --- a/compiler-rt/lib/asan/asan_shadow_setup.cc
- +++ b/compiler-rt/lib/asan/asan_shadow_setup.cc
- @@ -99,17 +99,21 @@ void InitializeShadowMemory() {
- // when necessary. When dynamic address is used, the macro |kLowShadowBeg|
- // expands to |__asan_shadow_memory_dynamic_address| which is
- // |kDefaultShadowSentinel|.
- + bool full_shadow_is_available = false;
- if (shadow_start == kDefaultShadowSentinel) {
- __asan_shadow_memory_dynamic_address = 0;
- CHECK_EQ(0, kLowShadowBeg);
- shadow_start = FindDynamicShadowStart();
- + if (SANITIZER_LINUX) full_shadow_is_available = true;
- }
- // Update the shadow memory address (potentially) used by instrumentation.
- __asan_shadow_memory_dynamic_address = shadow_start;
- if (kLowShadowBeg) shadow_start -= GetMmapGranularity();
- - bool full_shadow_is_available =
- - MemoryRangeIsAvailable(shadow_start, kHighShadowEnd);
- +
- + if (!full_shadow_is_available)
- + full_shadow_is_available =
- + MemoryRangeIsAvailable(shadow_start, kHighShadowEnd);
- #if SANITIZER_LINUX && defined(__x86_64__) && defined(_LP64) && \
- !ASAN_FIXED_MAPPING
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement