This CL allows asan allocator in fuchsia to decommit shadow memory for memory allocated using mmap. Big allocations in asan end up being allocated via `mmap` and freed with `munmap`. However, when that memory is freed, asan returns the corresponding shadow memory back to the OS via a call to `ReleaseMemoryPagesToOs`. In fuchsia, `ReleaseMemoryPagesToOs` is a no-op: to be able to free memory back to the OS, you have to hold a handle to the vmo you want to modify, which is tricky at the ReleaseMemoryPagesToOs level as that function is not exclusively used for shadow memory. The function `__sanitizer_fill_shadow` fills a given shadow memory range with a specific value, and if that value is 0 (unpoison) and the memory range is bigger than a threshold parameter, it will decommit that memory if it is all zeroes. This CL modifies the `FlushUnneededASanShadowMemory` function in `asan_poisoning.cpp` to add a call to `__sanitizer_fill_shadow` with value and threshold = 0. This way, all the unneeded shadow memory gets returned back to the OS. A test for this behavior can be found in fxrev.dev/391974 Differential Revision: https://reviews.llvm.org/D80355 Change-Id: Id6dd85693e78a222f0329d5b2201e0da753e01c0
10 KiB
10 KiB