summaryrefslogtreecommitdiff
path: root/libc/malloc_hooks/malloc_hooks.cpp
diff options
context:
space:
mode:
authorMitch Phillips <mitchp@google.com>2020-02-13 16:41:14 -0800
committerMitch Phillips <mitchp@google.com>2020-02-17 15:29:33 -0800
commitc03856c58e2c8c6f34a22834d9881dd53afd4d5c (patch)
tree70057f932ebe4c0a86633bb2daa88fc59ccf77f1 /libc/malloc_hooks/malloc_hooks.cpp
parentc65b55cded2369064458a772db2ed2dcf0e6d871 (diff)
[GWP-ASan] [heapprofd] Use ephemeral dispatch table when death prof.
GWP-ASan + heapprofd don't currently play nice together in some circumstances. heapprofd thinks it's still an only child, and refuses to accept the existence of its little brother, GWP-ASan. If GWP-ASan is installed before heapprofd, then heapprofd is *required* to respect that libc has a favourite child. If an allocation/free is passed to heapprofd, then heapprofd *must* (eventually) pass that allocation/free to GWP-ASan. If heapprofd doesn't do this, then a free() of a GWP-ASan allocation can be passed to the system allocator. This can happen in two places right now: 1. The heapprofd hooks simply clobber any trace of what was previously in the default_dispatch_table when enabled through the heapprofd signal. 2. Heapprofd can die when the system is under significant pressure. Some pipes can timeout, which ends up in the client calling ShutdownLazy() -> mallopt(M_RESET_HOOKS) -> DispatchReset(). This also clobbers any trace of the previous default_dispatch_table. To fix both these problems, we fix heapprofd to restore the previous default_dispatch_table whenever either circumstance happens. We do some tricky copying to avoid race conditions on the malloc_dispatch_table in fixing #1. Bug: 135634846 Test: Run HeapprofdEndToEnd.NativeProfilingActiveAtProcessExit/ForkMode a significant number of times with large amounts of system pressure (I just run bionic-unit-tests-scudo in parallel). You will see some test failures where heapprofd died due to system pressure, but never a death from the allocator. Tests should never fail when the system isn't under immense pressure. Change-Id: I20ab340d4bdc35d6d1012da5ee1a25634428d097
Diffstat (limited to 'libc/malloc_hooks/malloc_hooks.cpp')
0 files changed, 0 insertions, 0 deletions