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
Can you override empty ReleaseMemoryPagesToOS?