diff options
author | Kostya Serebryany <kcc@google.com> | 2018-08-24 01:44:17 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2018-08-24 01:44:17 +0000 |
commit | a7c3846a2eee2f4b461ca17f6a9eae85531da632 (patch) | |
tree | 84a8bffec547504b6db47aa283ff885105dcc0c4 /compiler-rt/lib/hwasan/hwasan_allocator.cc | |
parent | c6ba9ca1696416cd53d86fc79ad8fe2771243e8a (diff) | |
download | bcm5719-llvm-a7c3846a2eee2f4b461ca17f6a9eae85531da632.tar.gz bcm5719-llvm-a7c3846a2eee2f4b461ca17f6a9eae85531da632.zip |
[hwasan] implement detection of realloc-after-free
llvm-svn: 340593
Diffstat (limited to 'compiler-rt/lib/hwasan/hwasan_allocator.cc')
-rw-r--r-- | compiler-rt/lib/hwasan/hwasan_allocator.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/compiler-rt/lib/hwasan/hwasan_allocator.cc b/compiler-rt/lib/hwasan/hwasan_allocator.cc index 95dcc074d35..bd5fa30bda7 100644 --- a/compiler-rt/lib/hwasan/hwasan_allocator.cc +++ b/compiler-rt/lib/hwasan/hwasan_allocator.cc @@ -186,9 +186,10 @@ void HwasanDeallocate(StackTrace *stack, void *user_ptr) { CHECK(user_ptr); HWASAN_FREE_HOOK(user_ptr); - void *p = GetAddressFromPointer(user_ptr); if (!PointerAndMemoryTagsMatch(user_ptr)) ReportInvalidFree(stack, reinterpret_cast<uptr>(user_ptr)); + + void *p = GetAddressFromPointer(user_ptr); Metadata *meta = reinterpret_cast<Metadata *>(allocator.GetMetaData(p)); uptr size = meta->requested_size; meta->state = CHUNK_FREE; @@ -220,6 +221,9 @@ void *HwasanReallocate(StackTrace *stack, void *user_old_p, uptr new_size, alignment = Max(alignment, kShadowAlignment); new_size = RoundUpTo(new_size, kShadowAlignment); + if (!PointerAndMemoryTagsMatch(user_old_p)) + ReportInvalidFree(stack, reinterpret_cast<uptr>(user_old_p)); + void *old_p = GetAddressFromPointer(user_old_p); Metadata *meta = reinterpret_cast<Metadata*>(allocator.GetMetaData(old_p)); uptr old_size = meta->requested_size; |