[llvm-commits] [compiler-rt] r161949 - /compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator64.h
Dmitry Vyukov
dvyukov at google.com
Wed Aug 15 07:25:08 PDT 2012
Author: dvyukov
Date: Wed Aug 15 09:25:08 2012
New Revision: 161949
URL: http://llvm.org/viewvc/llvm-project?rev=161949&view=rev
Log:
tsan: fix several integer overflows
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator64.h
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator64.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator64.h?rev=161949&r1=161948&r2=161949&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator64.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator64.h Wed Aug 15 09:25:08 2012
@@ -178,9 +178,14 @@
UnmapOrDie(reinterpret_cast<void*>(AllocBeg()), AllocSize());
}
+ static uptr AllocBeg() { return kSpaceBeg - AdditionalSize(); }
+ static uptr AllocEnd() { return kSpaceBeg + kSpaceSize; }
+ static uptr AllocSize() { return kSpaceSize + AdditionalSize(); }
+
static const uptr kNumClasses = 256; // Power of two <= 256
private:
+ COMPILER_CHECK(kSpaceBeg % kSpaceSize == 0);
COMPILER_CHECK(kNumClasses <= SizeClassMap::kNumClasses);
static const uptr kRegionSize = kSpaceSize / kNumClasses;
COMPILER_CHECK((kRegionSize >> 32) > 0); // kRegionSize must be >= 2^32.
@@ -197,13 +202,11 @@
};
COMPILER_CHECK(sizeof(RegionInfo) == kCacheLineSize);
- uptr AdditionalSize() {
+ static uptr AdditionalSize() {
uptr res = sizeof(RegionInfo) * kNumClasses;
CHECK_EQ(res % kPageSize, 0);
return res;
}
- uptr AllocBeg() { return kSpaceBeg - AdditionalSize(); }
- uptr AllocSize() { return kSpaceSize + AdditionalSize(); }
RegionInfo *GetRegionInfo(uptr class_id) {
CHECK_LT(class_id, kNumClasses);
@@ -306,6 +309,8 @@
}
void *Allocate(uptr size, uptr alignment) {
CHECK_LE(alignment, kPageSize); // Not implemented. Do we need it?
+ if (size + alignment + 2 * kPageSize < size)
+ return 0;
uptr map_size = RoundUpMapSize(size);
void *map = MmapOrDie(map_size, "LargeMmapAllocator");
void *res = reinterpret_cast<void*>(reinterpret_cast<uptr>(map)
@@ -409,7 +414,10 @@
void *Allocate(AllocatorCache *cache, uptr size, uptr alignment,
bool cleared = false) {
// Returning 0 on malloc(0) may break a lot of code.
- if (size == 0) size = 1;
+ if (size == 0)
+ size = 1;
+ if (size + alignment < size)
+ return 0;
if (alignment > 8)
size = RoundUpTo(size, alignment);
void *res;
@@ -419,7 +427,7 @@
res = secondary_.Allocate(size, alignment);
if (alignment > 8)
CHECK_EQ(reinterpret_cast<uptr>(res) & (alignment - 1), 0);
- if (cleared)
+ if (cleared && res)
internal_memset(res, 0, size);
return res;
}
More information about the llvm-commits
mailing list