forked from OSchip/llvm-project
[hwasan] implement detection of realloc-after-free
llvm-svn: 340593
This commit is contained in:
parent
c6ba9ca169
commit
a7c3846a2e
|
@ -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;
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
// RUN: %clang_hwasan %s -o %t
|
||||
// RUN: not %run %t 50 2>&1 | FileCheck %s
|
||||
// RUN: not %run %t 40 2>&1 | FileCheck %s
|
||||
// RUN: not %run %t 30 2>&1 | FileCheck %s
|
||||
|
||||
// REQUIRES: stable-runtime
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sanitizer/hwasan_interface.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
__hwasan_enable_allocator_tagging();
|
||||
if (argc != 2) return 0;
|
||||
int realloc_size = atoi(argv[1]);
|
||||
char * volatile x = (char*)malloc(40);
|
||||
free(x);
|
||||
x = realloc(x, realloc_size);
|
||||
// CHECK: ERROR: HWAddressSanitizer: invalid-free on address
|
||||
// CHECK: tags: [[PTR_TAG:..]]/[[MEM_TAG:..]] (ptr/mem)
|
||||
// CHECK: freed here:
|
||||
// CHECK: previously allocated here:
|
||||
// CHECK: Memory tags around the buggy address (one tag corresponds to 16 bytes):
|
||||
// CHECK: =>{{.*}}[[MEM_TAG]]
|
||||
fprintf(stderr, "DONE\n");
|
||||
__hwasan_disable_allocator_tagging();
|
||||
// CHECK-NOT: DONE
|
||||
}
|
Loading…
Reference in New Issue