Short circuit free(nullptr).
This is needed to prevent a crash that happens when we enable heapprof
while Bionic atrace is also enabled.
Cherry-pick of c3a91a37e4503eb6537a81c3a17ee3187ae196b7
Bug: 137284735
Test: flash walleye-userdebug
profile system_server and concurrently run bionic atrace
Change-Id: Ia123a17b7df0790cb82c6c9073ce5638cd1a189f
Merged-In: Ia123a17b7df0790cb82c6c9073ce5638cd1a189f
diff --git a/src/profiling/memory/malloc_hooks.cc b/src/profiling/memory/malloc_hooks.cc
index 6070a03..387fd84 100644
--- a/src/profiling/memory/malloc_hooks.cc
+++ b/src/profiling/memory/malloc_hooks.cc
@@ -501,6 +501,17 @@
// sure that the address is not reused before we've processed the deallocation
// (which includes assigning a sequence id to it).
void HEAPPROFD_ADD_PREFIX(_free)(void* pointer) {
+ // free on a nullptr is valid but has no effect. Short circuit here, for
+ // various advantages:
+ // * More efficient
+ // * Notably printf calls free(nullptr) even when it is used in a way
+ // malloc-free way, as it unconditionally frees the pointer even if
+ // it was never written to.
+ // Short circuiting here makes it less likely to accidentally build
+ // infinite recursion.
+ if (pointer == nullptr)
+ return;
+
const MallocDispatch* dispatch = GetDispatch();
std::shared_ptr<perfetto::profiling::Client> client;
{