[GWP-ASan] Fix non-reentrant libc_globals init behaviour.
The WriteProtected mutator for __libc_globals isn't reentrant.
Previously we were calling __libc_globals.mutate() inside of GWP-ASan's
libc initialisation, which is called inside the __libc_globals.mutate().
This causes problems with malloc_debug and other malloc shims, as they
fail to install when GWP-ASan is sampling their processes.
Bug: 135634846
Test: atest bionic
Change-Id: Iae51faa8d78677eeab6204b6ab4f3ae1b7517ba5
diff --git a/libc/bionic/malloc_common_dynamic.cpp b/libc/bionic/malloc_common_dynamic.cpp
index 79d2521..ad28cb3 100644
--- a/libc/bionic/malloc_common_dynamic.cpp
+++ b/libc/bionic/malloc_common_dynamic.cpp
@@ -379,7 +379,7 @@
char prop[PROP_VALUE_MAX];
char* options = prop;
- MaybeInitGwpAsanFromLibc();
+ MaybeInitGwpAsanFromLibc(globals);
// Prefer malloc debug since it existed first and is a more complete
// malloc interceptor than the hooks.
@@ -529,7 +529,9 @@
errno = EINVAL;
return false;
}
- return MaybeInitGwpAsan(*reinterpret_cast<bool*>(arg));
+ __libc_globals.mutate([&](libc_globals* globals) {
+ return MaybeInitGwpAsan(globals, *reinterpret_cast<bool*>(arg));
+ });
}
// Try heapprofd's mallopt, as it handles options not covered here.
return HeapprofdMallopt(opcode, arg, arg_size);