summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2012-12-18 14:56:38 +0000
committerKostya Serebryany <kcc@google.com>2012-12-18 14:56:38 +0000
commitda1f82bcbe50b28d11e93eacdcd529e9f0e2ef38 (patch)
tree30e989d0b485f56869837b2436024d1f7ec52341 /lib
parent4554b7a7b345cd50ff8138b3cda8dd1135b965fa (diff)
downloadcompiler-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.h18
-rw-r--r--lib/sanitizer_common/tests/sanitizer_allocator_test.cc18
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++) {