aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Mayer <fmayer@google.com>2021-06-02 14:43:29 +0100
committerFlorian Mayer <fmayer@google.com>2021-06-04 11:15:27 +0100
commitb887dc0b5c5ac8ffa993a1ac6899ae92b6dbe8cb (patch)
tree790d939aa65ad043194b9604e8fe13b68d862955
parenta3b1926d75c2e46083429ae1e952035480dc3221 (diff)
downloadbionic-b887dc0b5c5ac8ffa993a1ac6899ae92b6dbe8cb.tar.gz
Fix dangling pointer in heapprofd API.
We would dlopen heapprofd_client.so, which has a static initializer [1] that passes a pointer to of its functions to heapprofd_client_api.so. If we dlclose heapprofd_client.so, this pointer is dangling. [1]: https://cs.android.com/android/platform/superproject/+/master:external/perfetto/src/profiling/memory/malloc_interceptor_bionic_hooks.cc?q=symbol:g_heap_id This is a cherry-pick of 85c7838bd9cb40949c08d957499357547c7cd687. Bug: 189332777 Change-Id: Ia4a9d9dd7c89eceec86c6fac5f4b66de85d7604e
-rw-r--r--libc/bionic/malloc_heapprofd.cpp10
1 files changed, 3 insertions, 7 deletions
diff --git a/libc/bionic/malloc_heapprofd.cpp b/libc/bionic/malloc_heapprofd.cpp
index 198bcbab7..741b45e98 100644
--- a/libc/bionic/malloc_heapprofd.cpp
+++ b/libc/bionic/malloc_heapprofd.cpp
@@ -325,12 +325,12 @@ void HeapprofdRememberHookConflict() {
static void CommonInstallHooks(libc_globals* globals) {
void* impl_handle = atomic_load(&gHeapprofdHandle);
- bool reusing_handle = impl_handle != nullptr;
- if (!reusing_handle) {
+ if (impl_handle == nullptr) {
impl_handle = LoadSharedLibrary(kHeapprofdSharedLib, kHeapprofdPrefix, &globals->malloc_dispatch_table);
if (impl_handle == nullptr) {
return;
}
+ atomic_store(&gHeapprofdHandle, impl_handle);
} else if (!InitSharedLibrary(impl_handle, kHeapprofdSharedLib, kHeapprofdPrefix, &globals->malloc_dispatch_table)) {
return;
}
@@ -341,11 +341,7 @@ static void CommonInstallHooks(libc_globals* globals) {
// MaybeModifyGlobals locks at this point.
atomic_store(&gPreviousDefaultDispatchTable, GetDefaultDispatchTable());
- if (FinishInstallHooks(globals, nullptr, kHeapprofdPrefix)) {
- atomic_store(&gHeapprofdHandle, impl_handle);
- } else if (!reusing_handle) {
- dlclose(impl_handle);
- }
+ FinishInstallHooks(globals, nullptr, kHeapprofdPrefix);
}
void HeapprofdInstallHooksAtInit(libc_globals* globals) {