mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[sanitizer][asan][win] Only unmap unneeded shadow memory on x86_64
D21942 /1128db8fe1
added support for committing shadow memory on demand on Win 64-bit. The reason it is not enabled on 32-bit wasn't clear but the page table overhead on Windows 7 may be a contributing factor. In `AsanMapUnmapCallback::OnUnmap`, `FlushUnneededASanShadowMemory` is called to release shadow memory. It calls `ReleaseMemoryPagesToOS`, which had been a no-op on Windows, until D95892 /81b1d3da09
in which it was changed to unmap full pages that the memory region covers. This was done on both 32-bit and 64-bit. AddressSanitizerInterface.GetHeapSizeTest appears to fail on i686 targets as a side effect of this. This test allocates and frees a huge chunk of memory which causes shadow memory to be unmapped immediately. When the test allocates the chunk of memory a second time, asan tries to reuse the same shadow memory region, but because the shadow memory has now been unmapped, it causes an access violation and crashes the test. x86_64 is not affected, because the code that handles commiting shadow memory on demand also handles this situation, allowing the test to work without crashing. Therefore, this patch changes `FlushUnneededASanShadowMemory` on Windows to only release/unmap the shadow memory on x86_64 to stop this from happening on i686. Differential Revision: https://reviews.llvm.org/D149025
This commit is contained in:
parent
e6ffd42a93
commit
0d5b51e0ac
@ -194,9 +194,12 @@ void AsanApplyToGlobals(globals_op_fptr op, const void *needle) {
|
||||
}
|
||||
|
||||
void FlushUnneededASanShadowMemory(uptr p, uptr size) {
|
||||
// Only asan on 64-bit Windows supports committing shadow memory on demand.
|
||||
#if SANITIZER_WINDOWS64
|
||||
// Since asan's mapping is compacting, the shadow chunk may be
|
||||
// not page-aligned, so we only flush the page-aligned portion.
|
||||
ReleaseMemoryPagesToOS(MemToShadow(p), MemToShadow(p + size));
|
||||
#endif
|
||||
}
|
||||
|
||||
// ---------------------- TSD ---------------- {{{
|
||||
|
Loading…
Reference in New Issue
Block a user