[sanitizer][Fuchsia] Add callback at end of __sanitizer_startup_hook (#131886)

Sanitizers using this hook on Fuchsia can define this function to do any
extra stuff at the end of the startup hook. For now this is only used by
HWASan which needs to explicitly be initialized before libc extensions
are intitialized.
This commit is contained in:
PiJoules
2025-05-06 10:03:38 -07:00
committed by GitHub
parent 304c7a87d0
commit 573721bf0c
5 changed files with 30 additions and 0 deletions

View File

@@ -25,6 +25,11 @@
# include "asan_thread.h"
# include "lsan/lsan_common.h"
namespace __sanitizer {
// ASan doesn't need to do anything else special in the startup hook.
void EarlySanitizerInit() {}
} // namespace __sanitizer
namespace __asan {
// The system already set up the shadow memory for us.

View File

@@ -31,6 +31,15 @@
SANITIZER_INTERFACE_ATTRIBUTE
THREADLOCAL uptr __hwasan_tls;
namespace __sanitizer {
void EarlySanitizerInit() {
// Setup the hwasan runtime before any `__libc_extensions_init`s are called.
// This is needed because libraries which define this function (like fdio)
// may be instrumented and either access `__hwasan_tls` or make runtime calls.
__hwasan_init();
}
} // namespace __sanitizer
namespace __hwasan {
bool InitShadow() {

View File

@@ -547,6 +547,8 @@ void __sanitizer_startup_hook(int argc, char **argv, char **envp,
__sanitizer::StoredEnviron = envp;
__sanitizer::MainThreadStackBase = reinterpret_cast<uintptr_t>(stack_base);
__sanitizer::MainThreadStackSize = stack_size;
EarlySanitizerInit();
}
void __sanitizer_set_report_path(const char *path) {

View File

@@ -32,6 +32,13 @@ struct MemoryMappingLayoutData {
void InitShadowBounds();
// Individual sanitizers can define this to explicitly run something at the end
// of `__sanitizer_startup_hook`. This can be useful if a sanitizer needs to do
// extra work after the common startup hook code is called and before module
// ctors are invoked. For example, hwasan can explicitly call its initializing
// function here so it can be set up before libc extensions are initialized.
void EarlySanitizerInit();
} // namespace __sanitizer
#endif // SANITIZER_FUCHSIA

View File

@@ -19,6 +19,13 @@
#include "ubsan_init.h"
#include "ubsan_signals_standalone.h"
#if SANITIZER_FUCHSIA
namespace __sanitizer {
// UBSan doesn't need to do anything else special in the startup hook.
void EarlySanitizerInit() {}
} // namespace __sanitizer
#endif // SANITIZER_FUCHSIA
namespace __ubsan {
class UbsanStandaloneInitializer {