Advertisement
Guest User

Untitled

a guest
Nov 17th, 2017
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. diff --git a/compiler-rt/lib/asan/asan_linux.cc b/compiler-rt/lib/asan/asan_linux.cc
  2. index 8ce4b96c26e..5cf466661f0 100644
  3. --- a/compiler-rt/lib/asan/asan_linux.cc
  4. +++ b/compiler-rt/lib/asan/asan_linux.cc
  5. @@ -82,15 +82,27 @@ void *AsanDoesNotSupportStaticLinkage() {
  6.    return &_DYNAMIC;  // defined in link.h
  7.  }
  8.  
  9. +static void UnmapFromTo(uptr from, uptr to) {
  10. +  CHECK(to >= from);
  11. +  if (to == from) return;
  12. +  uptr res = internal_munmap(reinterpret_cast<void *>(from), to - from);
  13. +  if (UNLIKELY(internal_iserror(res))) {
  14. +    Report(
  15. +        "ERROR: AddresSanitizer failed to unmap 0x%zx (%zd) bytes at address "
  16. +        "%p\n",
  17. +        to - from, to - from, from);
  18. +    CHECK("unable to unmap" && 0);
  19. +  }
  20. +}
  21. +
  22.  #if ASAN_PREMAP_SHADOW
  23.  uptr FindPremappedShadowStart() {
  24.    uptr granularity = GetMmapGranularity();
  25.    uptr shadow_start = reinterpret_cast<uptr>(&__asan_shadow);
  26. -  uptr shadow_size = PremapShadowSize();
  27. -  UnmapOrDie((void *)(shadow_start - granularity), shadow_size + granularity);
  28. -  // MmapNoAccess does not touch TotalMmap, but UnmapOrDie decreases it.
  29. -  // Compensate.
  30. -  IncreaseTotalMmap(shadow_size + granularity);
  31. +  uptr premap_shadow_size = PremapShadowSize();
  32. +  uptr shadow_size = RoundUpTo(kHighShadowEnd, granularity);
  33. +  // We may have mapped too much. Release extra memory.
  34. +  UnmapFromTo(shadow_start + shadow_size, shadow_start + premap_shadow_size);
  35.    return shadow_start;
  36.  }
  37.  #endif
  38. @@ -104,17 +116,15 @@ uptr FindDynamicShadowStart() {
  39.    uptr granularity = GetMmapGranularity();
  40.    uptr alignment = granularity * 8;
  41.    uptr left_padding = granularity;
  42. -  uptr shadow_size = kHighShadowEnd + left_padding;
  43. -  uptr map_size = shadow_size + alignment;
  44. +  uptr shadow_size = RoundUpTo(kHighShadowEnd, granularity);
  45. +  uptr map_size = shadow_size + left_padding + alignment;
  46.  
  47.    uptr map_start = (uptr)MmapNoAccess(map_size);
  48.    CHECK_NE(map_start, ~(uptr)0);
  49.  
  50. -  uptr shadow_start = RoundUpTo(map_start, alignment);
  51. -  UnmapOrDie((void *)map_start, map_size);
  52. -  // MmapNoAccess does not touch TotalMmap, but UnmapOrDie decreases it.
  53. -  // Compensate.
  54. -  IncreaseTotalMmap(map_size);
  55. +  uptr shadow_start = RoundUpTo(map_start + left_padding, alignment);
  56. +  UnmapFromTo(map_start, shadow_start - left_padding);
  57. +  UnmapFromTo(shadow_start + shadow_size, map_start + map_size);
  58.  
  59.    return shadow_start;
  60.  }
  61. diff --git a/compiler-rt/lib/asan/asan_shadow_setup.cc b/compiler-rt/lib/asan/asan_shadow_setup.cc
  62. index 08c009184f8..b3cf0b5c1ce 100644
  63. --- a/compiler-rt/lib/asan/asan_shadow_setup.cc
  64. +++ b/compiler-rt/lib/asan/asan_shadow_setup.cc
  65. @@ -99,17 +99,21 @@ void InitializeShadowMemory() {
  66.    // when necessary. When dynamic address is used, the macro |kLowShadowBeg|
  67.    // expands to |__asan_shadow_memory_dynamic_address| which is
  68.    // |kDefaultShadowSentinel|.
  69. +  bool full_shadow_is_available = false;
  70.    if (shadow_start == kDefaultShadowSentinel) {
  71.      __asan_shadow_memory_dynamic_address = 0;
  72.      CHECK_EQ(0, kLowShadowBeg);
  73.      shadow_start = FindDynamicShadowStart();
  74. +    if (SANITIZER_LINUX) full_shadow_is_available = true;
  75.    }
  76.    // Update the shadow memory address (potentially) used by instrumentation.
  77.    __asan_shadow_memory_dynamic_address = shadow_start;
  78.  
  79.    if (kLowShadowBeg) shadow_start -= GetMmapGranularity();
  80. -  bool full_shadow_is_available =
  81. -      MemoryRangeIsAvailable(shadow_start, kHighShadowEnd);
  82. +
  83. +  if (!full_shadow_is_available)
  84. +    full_shadow_is_available =
  85. +        MemoryRangeIsAvailable(shadow_start, kHighShadowEnd);
  86.  
  87.  #if SANITIZER_LINUX && defined(__x86_64__) && defined(_LP64) && \
  88.      !ASAN_FIXED_MAPPING
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement