diff --git a/compiler-rt/lib/asan/asan_allocator.cpp b/compiler-rt/lib/asan/asan_allocator.cpp --- a/compiler-rt/lib/asan/asan_allocator.cpp +++ b/compiler-rt/lib/asan/asan_allocator.cpp @@ -1187,7 +1187,7 @@ return allocated_size; } -int __sanitizer_get_allocation_bounds (const void *p, void **start, unsigned long long *size) { +int __sanitizer_get_allocation_bounds(const void *p, void **start, unsigned long long *size) { AsanChunk *m = __asan::instance.GetAsanChunkByAddr((uptr)p); if (!m) return 0; if (atomic_load(&m->chunk_state, memory_order_acquire) != CHUNK_ALLOCATED) diff --git a/compiler-rt/lib/dfsan/dfsan_allocator.cpp b/compiler-rt/lib/dfsan/dfsan_allocator.cpp --- a/compiler-rt/lib/dfsan/dfsan_allocator.cpp +++ b/compiler-rt/lib/dfsan/dfsan_allocator.cpp @@ -303,7 +303,7 @@ const void *beg = allocator.GetBlockBegin(p); if (beg == nullptr) return 0; - Metadata *b = (Metadata *)allocator.GetMetaData(p); + Metadata *b = (Metadata *)allocator.GetMetaData(beg); if (b == nullptr) return 0; if (b->requested_size == 0) diff --git a/compiler-rt/lib/hwasan/hwasan_allocator.cpp b/compiler-rt/lib/hwasan/hwasan_allocator.cpp --- a/compiler-rt/lib/hwasan/hwasan_allocator.cpp +++ b/compiler-rt/lib/hwasan/hwasan_allocator.cpp @@ -643,12 +643,12 @@ uptr __sanitizer_get_allocated_size(const void *p) { return AllocationSize(p); } -int __sanitizer_get_allocation_bounds (const void *p, void **start, unsigned long long *size) { +int __sanitizer_get_allocation_bounds(const void *p, void **start, unsigned long long *size) { const void *untagged_ptr = UntagPtr(p); if (!untagged_ptr) return 0; const void *beg = allocator.GetBlockBegin(untagged_ptr); if (beg == nullptr) return 0; - Metadata *b = (Metadata *)allocator.GetMetaData(untagged_ptr); + Metadata *b = (Metadata *)allocator.GetMetaData(beg); if (b->GetRequestedSize() == 0) return 0; *start = (void*)beg; *size = b->GetRequestedSize(); diff --git a/compiler-rt/lib/lsan/lsan_allocator.cpp b/compiler-rt/lib/lsan/lsan_allocator.cpp --- a/compiler-rt/lib/lsan/lsan_allocator.cpp +++ b/compiler-rt/lib/lsan/lsan_allocator.cpp @@ -369,11 +369,11 @@ } SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE -int __sanitizer_get_allocation_bounds (const void *p, void **start, unsigned long long *size) { +int __sanitizer_get_allocation_bounds(const void *p, void **start, unsigned long long *size) { if (!p) return 0; const void *beg = allocator.GetBlockBegin(p); if (beg == nullptr) return 0; - ChunkMetadata *m = Metadata(p); + ChunkMetadata *m = Metadata(beg); if (m == nullptr) return 0; if (m->requested_size == 0) return 0; *start = (void*)beg; diff --git a/compiler-rt/lib/memprof/memprof_allocator.cpp b/compiler-rt/lib/memprof/memprof_allocator.cpp --- a/compiler-rt/lib/memprof/memprof_allocator.cpp +++ b/compiler-rt/lib/memprof/memprof_allocator.cpp @@ -703,7 +703,7 @@ return memprof_malloc_usable_size(p, 0, 0); } -int __sanitizer_get_allocation_bounds (const void *p, void **start, unsigned long long *size) { +int __sanitizer_get_allocation_bounds(const void *p, void **start, unsigned long long *size) { u64 user_requested_size; MemprofChunk *m = instance.GetMemprofChunkByAddr((uptr)p, user_requested_size); if (!m) diff --git a/compiler-rt/lib/msan/msan_allocator.cpp b/compiler-rt/lib/msan/msan_allocator.cpp --- a/compiler-rt/lib/msan/msan_allocator.cpp +++ b/compiler-rt/lib/msan/msan_allocator.cpp @@ -375,15 +375,14 @@ uptr __sanitizer_get_allocated_size(const void *p) { return AllocationSize(p); } -int __sanitizer_get_allocation_bounds (const void *p, void **start, unsigned long long *size) { +int __sanitizer_get_allocation_bounds(const void *p, void **start, unsigned long long *size) { if (!p) return 0; const void *beg = allocator.GetBlockBegin(p); if (beg == nullptr) return 0; - Metadata *b = (Metadata *)allocator.GetMetaData(p); + Metadata *b = (Metadata *)allocator.GetMetaData(beg); if (b == nullptr) return 0; if (b->requested_size == 0) return 0; *start = (void*)beg; *size = b->requested_size; - return 1; } diff --git a/compiler-rt/lib/tsan/rtl/tsan_mman.cpp b/compiler-rt/lib/tsan/rtl/tsan_mman.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_mman.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_mman.cpp @@ -434,15 +434,16 @@ return user_alloc_usable_size(p); } -int __sanitizer_get_allocation_bounds (const void *p, void **start, unsigned long long *size) { +int __sanitizer_get_allocation_bounds(const void *p, void **start, unsigned long long *size) { if (p == 0 || !IsAppMem((uptr)p)) return 0; - MBlock *b = ctx->metamap.GetBlock((uptr)p); - if (!b) - return 0; // Not a valid pointer. - const void *beg = allocator()->GetBlockBegin(p); if (beg == nullptr) return 0; + + MBlock *b = ctx->metamap.GetBlock((uptr)beg); + if (!b) + return 0; // Not a valid pointer. + *start = (void*)beg; if (b->siz == 0) { diff --git a/compiler-rt/test/msan/get_allocation_bounds.cpp b/compiler-rt/test/sanitizer_common/TestCases/get_allocation_bounds.cpp rename from compiler-rt/test/msan/get_allocation_bounds.cpp rename to compiler-rt/test/sanitizer_common/TestCases/get_allocation_bounds.cpp --- a/compiler-rt/test/msan/get_allocation_bounds.cpp +++ b/compiler-rt/test/sanitizer_common/TestCases/get_allocation_bounds.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx_msan -O0 -g %s -o %t && %run %t +// RUN: %clangxx -O0 -g %s -o %t && %run %t #include #include @@ -22,6 +22,7 @@ printf("Bounds ok? %d\n", __sanitizer_get_allocation_bounds(array + i, &start, &size)); + fflush(stdout); assert(__sanitizer_get_allocation_bounds(array + i, &start, &size)); printf("Size: %llu\n", size); fflush(stdout);