Commit ed66c39a authored by Dan Melnic's avatar Dan Melnic Committed by Facebook Github Bot

Avoid UB by using an std::atomic<FatalSignalCallbackRegistry*>

Summary: Avoid UB by using an std::atomic<FatalSignalCallbackRegistry*>

Reviewed By: yfeldblum

Differential Revision: D13359882

fbshipit-source-id: 02f5f758bd0ba0c6201a384b993dafcfa7ab4546
parent a6754a7c
......@@ -86,12 +86,14 @@ void FatalSignalCallbackRegistry::run() {
}
}
std::atomic<FatalSignalCallbackRegistry*> gFatalSignalCallbackRegistry{};
static FatalSignalCallbackRegistry* getFatalSignalCallbackRegistry() {
// Leak it so we don't have to worry about destruction order
static FatalSignalCallbackRegistry* gFatalSignalCallbackRegistry =
static FatalSignalCallbackRegistry* fatalSignalCallbackRegistry =
new FatalSignalCallbackRegistry();
return gFatalSignalCallbackRegistry;
return fatalSignalCallbackRegistry;
}
struct {
......@@ -421,7 +423,10 @@ void innerSignalHandler(int signum, siginfo_t* info, void* /* uctx */) {
gStackTracePrinter->printStackTrace(true); // with symbolization
// Run user callbacks
getFatalSignalCallbackRegistry()->run();
auto callbacks = gFatalSignalCallbackRegistry.load(std::memory_order_acquire);
if (callbacks) {
callbacks->run();
}
}
void signalHandler(int signum, siginfo_t* info, void* uctx) {
......@@ -477,7 +482,8 @@ void installFatalSignalHandler() {
// make sure gFatalSignalCallbackRegistry is created before we
// install the fatal signal handler
getFatalSignalCallbackRegistry();
gFatalSignalCallbackRegistry.store(
getFatalSignalCallbackRegistry(), std::memory_order_release);
// If a small sigaltstack is enabled (ex. Rust stdlib might use sigaltstack
// to set a small stack), the default SafeStackTracePrinter would likely
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment