diff options
author | Kostya Serebryany <kcc@google.com> | 2012-12-18 14:56:38 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2012-12-18 14:56:38 +0000 |
commit | da1f82bcbe50b28d11e93eacdcd529e9f0e2ef38 (patch) | |
tree | 30e989d0b485f56869837b2436024d1f7ec52341 /lib | |
parent | 4554b7a7b345cd50ff8138b3cda8dd1135b965fa (diff) | |
download | compiler-rt-da1f82bcbe50b28d11e93eacdcd529e9f0e2ef38.tar.gz compiler-rt-da1f82bcbe50b28d11e93eacdcd529e9f0e2ef38.tar.bz2 compiler-rt-da1f82bcbe50b28d11e93eacdcd529e9f0e2ef38.tar.xz |
[sanitizer] fix LargeMmapAllocator::GetBlockBegin
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@170434 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sanitizer_common/sanitizer_allocator.h | 18 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_allocator_test.cc | 18 |
2 files changed, 17 insertions, 19 deletions
diff --git a/lib/sanitizer_common/sanitizer_allocator.h b/lib/sanitizer_common/sanitizer_allocator.h index b10957ab..7a97cc9f 100644 --- a/lib/sanitizer_common/sanitizer_allocator.h +++ b/lib/sanitizer_common/sanitizer_allocator.h @@ -674,17 +674,11 @@ class LargeMmapAllocator { } bool PointerIsMine(void *p) { - // Fast check. - if ((reinterpret_cast<uptr>(p) & (page_size_ - 1))) return false; - SpinMutexLock l(&mutex_); - for (Header *l = list_; l; l = l->next) { - if (GetUser(l) == p) return true; - } - return false; + return GetBlockBegin(p) != 0; } uptr GetActuallyAllocatedSize(void *p) { - return RoundUpMapSize(GetHeader(p)->size) - page_size_; + return RoundUpTo(GetHeader(p)->size, page_size_); } // At least page_size_/2 metadata bytes is available. @@ -692,12 +686,12 @@ class LargeMmapAllocator { return GetHeader(p) + 1; } - void *GetBlockBegin(void *p) { + void *GetBlockBegin(void *ptr) { + uptr p = reinterpret_cast<uptr>(ptr); SpinMutexLock l(&mutex_); for (Header *l = list_; l; l = l->next) { - void *b = GetUser(l); - if (p >= b && p < (u8*)b + l->size) - return b; + if (p >= l->map_beg && p < l->map_beg + l->map_size) + return GetUser(l); } return 0; } diff --git a/lib/sanitizer_common/tests/sanitizer_allocator_test.cc b/lib/sanitizer_common/tests/sanitizer_allocator_test.cc index 04269eda..bb239f9d 100644 --- a/lib/sanitizer_common/tests/sanitizer_allocator_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_allocator_test.cc @@ -106,6 +106,8 @@ void TestSizeClassAllocator() { CHECK_EQ(x, a->GetBlockBegin(x)); CHECK_EQ(x, a->GetBlockBegin(x + size - 1)); CHECK(a->PointerIsMine(x)); + CHECK(a->PointerIsMine(x + size - 1)); + CHECK(a->PointerIsMine(x + size / 2)); CHECK_GE(a->GetActuallyAllocatedSize(x), size); uptr class_id = a->GetSizeClass(x); CHECK_EQ(class_id, Allocator::SizeClassMapT::ClassID(size)); @@ -265,16 +267,16 @@ TEST(SanitizerCommon, LargeMmapAllocator) { a.Init(); static const int kNumAllocs = 100; - void *allocated[kNumAllocs]; + char *allocated[kNumAllocs]; static const uptr size = 1000; // Allocate some. for (int i = 0; i < kNumAllocs; i++) { - allocated[i] = a.Allocate(size, 1); + allocated[i] = (char *)a.Allocate(size, 1); } // Deallocate all. CHECK_GT(a.TotalMemoryUsed(), size * kNumAllocs); for (int i = 0; i < kNumAllocs; i++) { - void *p = allocated[i]; + char *p = allocated[i]; CHECK(a.PointerIsMine(p)); a.Deallocate(p); } @@ -283,7 +285,7 @@ TEST(SanitizerCommon, LargeMmapAllocator) { // Allocate some more, also add metadata. for (int i = 0; i < kNumAllocs; i++) { - void *x = a.Allocate(size, 1); + char *x = (char *)a.Allocate(size, 1); CHECK_GE(a.GetActuallyAllocatedSize(x), size); uptr *meta = reinterpret_cast<uptr*>(a.GetMetaData(x)); *meta = i; @@ -293,7 +295,7 @@ TEST(SanitizerCommon, LargeMmapAllocator) { // Deallocate all in reverse order. for (int i = 0; i < kNumAllocs; i++) { int idx = kNumAllocs - i - 1; - void *p = allocated[idx]; + char *p = allocated[idx]; uptr *meta = reinterpret_cast<uptr*>(a.GetMetaData(p)); CHECK_EQ(*meta, idx); CHECK(a.PointerIsMine(p)); @@ -304,9 +306,11 @@ TEST(SanitizerCommon, LargeMmapAllocator) { for (uptr alignment = 8; alignment <= max_alignment; alignment *= 2) { for (int i = 0; i < kNumAllocs; i++) { uptr size = ((i % 10) + 1) * 4096; - allocated[i] = a.Allocate(size, alignment); + char *p = allocated[i] = (char *)a.Allocate(size, alignment); + CHECK_EQ(p, a.GetBlockBegin(p)); + CHECK_EQ(p, a.GetBlockBegin(p + size - 1)); + CHECK_EQ(p, a.GetBlockBegin(p + size / 2)); CHECK_EQ(0, (uptr)allocated[i] % alignment); - char *p = (char*)allocated[i]; p[0] = p[size - 1] = 0; } for (int i = 0; i < kNumAllocs; i++) { |