diff options
Diffstat (limited to 'compiler-rt')
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_allocator.h | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cc | 9 |
2 files changed, 7 insertions, 4 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h index a9fc300f066..b10957abc36 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h @@ -297,7 +297,7 @@ class SizeClassAllocator64 { uptr beg_idx = region->allocated_user; uptr end_idx = beg_idx + kPopulateSize; uptr region_beg = kSpaceBeg + kRegionSize * class_id; - if (end_idx > region->mapped_user) { + if (Max(end_idx, beg_idx + size) > region->mapped_user) { // Do the mmap for the user memory. CHECK_GT(region->mapped_user + kUserMapSize, end_idx); MapWithCallback(region_beg + region->mapped_user, kUserMapSize); diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cc b/compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cc index 0ee8c85998c..04269eda8ab 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cc +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cc @@ -96,12 +96,15 @@ void TestSizeClassAllocator() { uptr size = sizes[s]; if (!a->CanAllocate(size, 1)) continue; // printf("s = %ld\n", size); - uptr n_iter = std::max((uptr)2, 1000000 / size); + uptr n_iter = std::max((uptr)6, 1000000 / size); for (uptr i = 0; i < n_iter; i++) { - void *x = a->Allocate(size, 1); + char *x = (char*)a->Allocate(size, 1); + x[0] = 0; + x[size - 1] = 0; + x[size / 2] = 0; allocated.push_back(x); CHECK_EQ(x, a->GetBlockBegin(x)); - CHECK_EQ(x, a->GetBlockBegin((char*)x + size - 1)); + CHECK_EQ(x, a->GetBlockBegin(x + size - 1)); CHECK(a->PointerIsMine(x)); CHECK_GE(a->GetActuallyAllocatedSize(x), size); uptr class_id = a->GetSizeClass(x); |

