Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[asan] Use dynamic shadow on 32-bit Android, try 2.
Summary: This change reverts r318575 and changes FindDynamicShadowStart() to keep the memory range it found mapped PROT_NONE to make sure it is not reused. We also skip MemoryRangeIsAvailable() check, because it is (a) unnecessary, and (b) would fail anyway. Reviewers: pcc, vitalybuka, kcc Subscribers: srhines, kubamracek, mgorny, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D40203 llvm-svn: 318666
- Loading branch information
Showing
14 changed files
with
310 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
//===-- 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() { | ||
uptr granularity = GetMmapGranularity(); | ||
return RoundUpTo(GetMaxVirtualAddress() >> SHADOW_SCALE, granularity); | ||
} | ||
|
||
// 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
//===-- asan_mapping.h ------------------------------------------*- C++ -*-===// | ||
// | ||
// 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. | ||
// | ||
// Premap shadow range with an ifunc resolver. | ||
//===----------------------------------------------------------------------===// | ||
|
||
|
||
#ifndef ASAN_PREMAP_SHADOW_H | ||
#define ASAN_PREMAP_SHADOW_H | ||
|
||
#if ASAN_PREMAP_SHADOW | ||
namespace __asan { | ||
// Conservative upper limit. | ||
uptr PremapShadowSize(); | ||
bool PremapShadowFailed(); | ||
} | ||
#endif | ||
|
||
extern "C" INTERFACE_ATTRIBUTE void __asan_shadow(); | ||
extern "C" decltype(__asan_shadow)* __asan_premap_shadow(); | ||
|
||
#endif // ASAN_PREMAP_SHADOW_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.