From c8208c52581616f4a2daf3e3649d9febb1c9bd1c Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Sat, 15 Dec 2012 18:36:23 +0000 Subject: [PATCH] [sanitizer] fix a bug that has crept into the sanitizer allocator and caused SEGV on allocations between 1Mb and 2Mb, improve the test llvm-svn: 170274 --- compiler-rt/lib/sanitizer_common/sanitizer_allocator.h | 2 +- .../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 a9fc300..b10957a 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 0ee8c85..04269ed 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); -- 2.7.4