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 @@ -732,6 +732,25 @@ return reinterpret_cast(alloc_beg); } + AsanChunk *GetAsanChunkDebug(void *alloc_beg) { + if (!alloc_beg) return nullptr; + if (!allocator.FromPrimary(alloc_beg)) { + uptr *meta = reinterpret_cast(allocator.GetMetaData(alloc_beg)); + AsanChunk *m = reinterpret_cast(meta[1]); + Printf("GetAsanChunkDebug1 alloc_beg %p meta %p m %p\n", alloc_beg, meta, m); + return m; + } + uptr *alloc_magic = reinterpret_cast(alloc_beg); + Printf( + "GetAsanChunkDebug2 alloc_beg %p alloc_magic %p alloc_magic[0] %p " + "alloc_magic[1] %p\n", + alloc_beg, alloc_magic, alloc_magic[0], alloc_magic[1]); + if (alloc_magic[0] == kAllocBegMagic) + return reinterpret_cast(alloc_magic[1]); + return reinterpret_cast(alloc_beg); + } + + AsanChunk *GetAsanChunkByAddr(uptr p) { void *alloc_beg = allocator.GetBlockBegin(reinterpret_cast(p)); return GetAsanChunk(alloc_beg); @@ -744,6 +763,13 @@ return GetAsanChunk(alloc_beg); } + AsanChunk *GetAsanChunkByAddrFastLockedDebug(uptr p) { + void *alloc_beg = + allocator.GetBlockBeginFastLockedDebug(reinterpret_cast(p)); + Printf("GetAsanChunkByAddrFastLockedDebug p %p alloc_beg %p\n", p, alloc_beg); + return GetAsanChunkDebug(alloc_beg); + } + uptr AllocationSize(uptr p) { AsanChunk *m = GetAsanChunkByAddr(p); if (!m) return 0; @@ -1040,16 +1066,25 @@ // Debug code. Delete once issue #1193 is chased down. extern "C" SANITIZER_WEAK_ATTRIBUTE const char *__lsan_current_stage; +void GetUserBeginDebug(uptr chunk) { + Printf("GetUserBeginDebug1 chunk %p\n", chunk); + __asan::AsanChunk *m = __asan::instance.GetAsanChunkByAddrFastLockedDebug(chunk); + Printf("GetUserBeginDebug2 m %p\n", m); +} + uptr GetUserBegin(uptr chunk) { __asan::AsanChunk *m = __asan::instance.GetAsanChunkByAddrFastLocked(chunk); - if (!m) + if (!m) { Printf( "ASAN is about to crash with a CHECK failure.\n" "The ASAN developers are trying to chase down this bug,\n" "so if you've encountered this bug please let us know.\n" "See also: https://github.com/google/sanitizers/issues/1193\n" + "Internal ref b/149237057\n" "chunk: %p caller %p __lsan_current_stage %s\n", chunk, GET_CALLER_PC(), __lsan_current_stage); + GetUserBeginDebug(chunk); + } CHECK(m); return m->Beg(); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_combined.h @@ -142,6 +142,13 @@ return secondary_.GetBlockBeginFastLocked(p); } + void *GetBlockBeginFastLockedDebug(void *p) { + if (primary_.PointerIsMine(p)) + return primary_.GetBlockBeginDebug(p); + return secondary_.GetBlockBeginFastLocked(p); + } + + uptr GetActuallyAllocatedSize(void *p) { if (primary_.PointerIsMine(p)) return primary_.GetActuallyAllocatedSize(p); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h @@ -210,6 +210,7 @@ uptr res = beg + (n * (u32)size); return reinterpret_cast(res); } + void *GetBlockBeginDebug(const void *p) { return GetBlockBegin(p); } uptr GetActuallyAllocatedSize(void *p) { CHECK(PointerIsMine(p)); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary64.h @@ -199,6 +199,29 @@ return nullptr; } + void *GetBlockBeginDebug(const void *p) { + uptr class_id = GetSizeClass(p); + uptr size = ClassIdToSize(class_id); + Printf("GetBlockBeginDebug1 p %p class_id %p size %p\n", p, class_id, size); + if (!size) return nullptr; + uptr chunk_idx = GetChunkIdx((uptr)p, size); + uptr reg_beg = GetRegionBegin(p); + uptr beg = chunk_idx * size; + uptr next_beg = beg + size; + Printf( + "GetBlockBeginDebug2 chunk_idx %p reg_beg %p beg %p next_beg %p " + "kNumClasses %p\n", + chunk_idx, reg_beg, beg, next_beg, kNumClasses); + if (class_id >= kNumClasses) return nullptr; + const RegionInfo *region = AddressSpaceView::Load(GetRegionInfo(class_id)); + Printf("GetBlockBeginDebug3 region %p region->mapped_user %p\n", region, + region->mapped_user); + if (region->mapped_user >= next_beg) + return reinterpret_cast(reg_beg + beg); + return nullptr; + } + + uptr GetActuallyAllocatedSize(void *p) { CHECK(PointerIsMine(p)); return ClassIdToSize(GetSizeClass(p));