Snap for 5736565 from 62b8eb7c6ae9f3ef546c35ff741c7cbbfea106a6 to qt-c2f2-release

Change-Id: I3216b858e6fc1b679f863e68624714b49fbb3204
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;
   {