diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-11-18 00:22:34 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-11-18 00:22:34 +0000 |
commit | 8b13106061d170cc38d0f7e9d2cc7119858549e3 (patch) | |
tree | 5ce3e6be301358c6bf29aaf244f14519b5a7fbb5 /lib/asan/asan_premap_shadow.cc | |
parent | c5eabf396b82cee5290244952a21ce3ee89ec0af (diff) |
Revert "[asan] Use dynamic shadow on 32-bit Android" and 3 more.
Revert the following commits:
r318369 [asan] Fallback to non-ifunc dynamic shadow on android<22.
r318235 [asan] Prevent rematerialization of &__asan_shadow.
r317948 [sanitizer] Remove unnecessary attribute hidden.
r317943 [asan] Use dynamic shadow on 32-bit Android.
MemoryRangeIsAvailable() reads /proc/$PID/maps into an mmap-ed buffer
that may overlap with the address range that we plan to use for the
dynamic shadow mapping. This is causing random startup crashes.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@318575 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/asan/asan_premap_shadow.cc')
-rw-r--r-- | lib/asan/asan_premap_shadow.cc | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/lib/asan/asan_premap_shadow.cc b/lib/asan/asan_premap_shadow.cc deleted file mode 100644 index 2d20c3b8c..000000000 --- a/lib/asan/asan_premap_shadow.cc +++ /dev/null @@ -1,78 +0,0 @@ -//===-- asan_premap_shadow.cc ---------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file is a part of AddressSanitizer, an address sanity checker. -// -// Reserve shadow memory with an ifunc resolver. -//===----------------------------------------------------------------------===// - -#include "asan_mapping.h" - -#if ASAN_PREMAP_SHADOW - -#include "asan_premap_shadow.h" -#include "sanitizer_common/sanitizer_posix.h" - -namespace __asan { - -// The code in this file needs to run in an unrelocated binary. It may not -// access any external symbol, including its own non-hidden globals. - -// Conservative upper limit. -uptr PremapShadowSize() { - return GetMaxVirtualAddress() >> SHADOW_SCALE; -} - -// Returns an address aligned to 8 pages, such that one page on the left and -// PremapShadowSize() bytes on the right of it are mapped r/o. -uptr PremapShadow() { - uptr granularity = GetMmapGranularity(); - uptr alignment = granularity * 8; - uptr left_padding = granularity; - uptr shadow_size = PremapShadowSize(); - 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 + left_padding, alignment); - uptr shadow_end = shadow_start + shadow_size; - internal_munmap(reinterpret_cast<void *>(map_start), - shadow_start - left_padding - map_start); - internal_munmap(reinterpret_cast<void *>(shadow_end), - map_start + map_size - shadow_end); - return shadow_start; -} - -bool PremapShadowFailed() { - uptr shadow = reinterpret_cast<uptr>(&__asan_shadow); - uptr resolver = reinterpret_cast<uptr>(&__asan_premap_shadow); - // shadow == resolver is how Android KitKat and older handles ifunc. - // shadow == 0 just in case. - if (shadow == 0 || shadow == resolver) - return true; - return false; -} -} // namespace __asan - -extern "C" { -decltype(__asan_shadow)* __asan_premap_shadow() { - // The resolver may be called multiple times. Map the shadow just once. - static uptr premapped_shadow = 0; - if (!premapped_shadow) premapped_shadow = __asan::PremapShadow(); - return reinterpret_cast<decltype(__asan_shadow)*>(premapped_shadow); -} - -// __asan_shadow is a "function" that has the same address as the first byte of -// the shadow mapping. -INTERFACE_ATTRIBUTE __attribute__((ifunc("__asan_premap_shadow"))) void -__asan_shadow(); -} - -#endif // ASAN_PREMAP_SHADOW |