diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-10-15 11:33:48 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-10-15 11:33:48 +0000 |
commit | 600d51680fb20f670695e931de60df4d88616e96 (patch) | |
tree | f517aa1f38c44fcb0b3434f6290e975620431f51 /lib/msan/msan_allocator.cc | |
parent | 0f7a2acb3326a5900d1a1339ebf959b14b372e0d (diff) |
[msan] Implement allocator_may_return_null=1 in MemorySanitizer.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@192687 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/msan_allocator.cc')
-rw-r--r-- | lib/msan/msan_allocator.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/msan/msan_allocator.cc b/lib/msan/msan_allocator.cc index 0fe1297a8..04d6fedb2 100644 --- a/lib/msan/msan_allocator.cc +++ b/lib/msan/msan_allocator.cc @@ -25,6 +25,7 @@ struct Metadata { static const uptr kAllocatorSpace = 0x600000000000ULL; static const uptr kAllocatorSize = 0x80000000000; // 8T. static const uptr kMetadataSize = sizeof(Metadata); +static const uptr kMaxAllowedMallocSize = 8UL << 30; typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, kMetadataSize, DefaultSizeClassMap> PrimaryAllocator; @@ -48,6 +49,11 @@ static inline void Init() { static void *MsanAllocate(StackTrace *stack, uptr size, uptr alignment, bool zeroise) { Init(); + if (size > kMaxAllowedMallocSize) { + Report("WARNING: MemorySanitizer failed to allocate %p bytes\n", + (void *)size); + return AllocatorReturnNull(); + } void *res = allocator.Allocate(&cache, size, alignment, false); Metadata *meta = reinterpret_cast<Metadata*>(allocator.GetMetaData(res)); meta->requested_size = size; @@ -110,9 +116,10 @@ void *MsanReallocate(StackTrace *stack, void *old_p, uptr new_size, uptr memcpy_size = Min(new_size, old_size); void *new_p = MsanAllocate(stack, new_size, alignment, zeroise); // Printf("realloc: old_size %zd new_size %zd\n", old_size, new_size); - if (new_p) + if (new_p) { __msan_memcpy(new_p, old_p, memcpy_size); - MsanDeallocate(stack, old_p); + MsanDeallocate(stack, old_p); + } return new_p; } |