summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_mac.cc
diff options
context:
space:
mode:
authorKuba Mracek <mracek@apple.com>2018-02-26 18:33:21 +0000
committerKuba Mracek <mracek@apple.com>2018-02-26 18:33:21 +0000
commit7049a1add5445b19386ceb5bbf5c9f1b14a4aadd (patch)
treef8c8dbd081c176f9785a5a3e990931a56802492d /lib/sanitizer_common/sanitizer_mac.cc
parente89072679fec4d71608008233f20e756812704db (diff)
[asan] Be more careful and verbose when allocating dynamic shadow memory
FindAvailableMemoryRange can currently overwrite existing memory (by restricting the VM below addresses that are already used). This patch adds a check to make sure we don't restrict the VM space too much. We are also now more explicit about why the lookup failed and print out verbose values. Differential Revision: https://reviews.llvm.org/D43318 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@326106 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_mac.cc')
-rw-r--r--lib/sanitizer_common/sanitizer_mac.cc12
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/sanitizer_common/sanitizer_mac.cc b/lib/sanitizer_common/sanitizer_mac.cc
index 8fa61318a..3eb023ebf 100644
--- a/lib/sanitizer_common/sanitizer_mac.cc
+++ b/lib/sanitizer_common/sanitizer_mac.cc
@@ -887,10 +887,9 @@ uptr GetMaxVirtualAddress() {
return GetMaxUserVirtualAddress();
}
-uptr FindAvailableMemoryRange(uptr shadow_size,
- uptr alignment,
- uptr left_padding,
- uptr *largest_gap_found) {
+uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,
+ uptr *largest_gap_found,
+ uptr *max_occupied_addr) {
typedef vm_region_submap_short_info_data_64_t RegionInfo;
enum { kRegionInfoSize = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64 };
// Start searching for available memory region past PAGEZERO, which is
@@ -902,6 +901,7 @@ uptr FindAvailableMemoryRange(uptr shadow_size,
mach_vm_address_t free_begin = start_address;
kern_return_t kr = KERN_SUCCESS;
if (largest_gap_found) *largest_gap_found = 0;
+ if (max_occupied_addr) *max_occupied_addr = 0;
while (kr == KERN_SUCCESS) {
mach_vm_size_t vmsize = 0;
natural_t depth = 0;
@@ -913,13 +913,15 @@ uptr FindAvailableMemoryRange(uptr shadow_size,
// No more regions beyond "address", consider the gap at the end of VM.
address = GetMaxVirtualAddress() + 1;
vmsize = 0;
+ } else {
+ if (max_occupied_addr) *max_occupied_addr = address + vmsize;
}
if (free_begin != address) {
// We found a free region [free_begin..address-1].
uptr gap_start = RoundUpTo((uptr)free_begin + left_padding, alignment);
uptr gap_end = RoundDownTo((uptr)address, alignment);
uptr gap_size = gap_end > gap_start ? gap_end - gap_start : 0;
- if (shadow_size < gap_size) {
+ if (size < gap_size) {
return gap_start;
}