[sanitizer] fix a bug that has crept into the sanitizer allocator and caused SEGV...
authorKostya Serebryany <kcc@google.com>
Sat, 15 Dec 2012 18:36:23 +0000 (18:36 +0000)
committerKostya Serebryany <kcc@google.com>
Sat, 15 Dec 2012 18:36:23 +0000 (18:36 +0000)
llvm-svn: 170274

compiler-rt/lib/sanitizer_common/sanitizer_allocator.h
compiler-rt/lib/sanitizer_common/tests/sanitizer_allocator_test.cc

index a9fc300..b10957a 100644 (file)
@@ -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);
index 0ee8c85..04269ed 100644 (file)
@@ -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);