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() { ...@@ -86,12 +86,14 @@ void FatalSignalCallbackRegistry::run() {
} }
} }
std::atomic<FatalSignalCallbackRegistry*> gFatalSignalCallbackRegistry{};
static FatalSignalCallbackRegistry* getFatalSignalCallbackRegistry() { static FatalSignalCallbackRegistry* getFatalSignalCallbackRegistry() {
// Leak it so we don't have to worry about destruction order // Leak it so we don't have to worry about destruction order
static FatalSignalCallbackRegistry* gFatalSignalCallbackRegistry = static FatalSignalCallbackRegistry* fatalSignalCallbackRegistry =
new FatalSignalCallbackRegistry(); new FatalSignalCallbackRegistry();
return gFatalSignalCallbackRegistry; return fatalSignalCallbackRegistry;
} }
struct { struct {
...@@ -421,7 +423,10 @@ void innerSignalHandler(int signum, siginfo_t* info, void* /* uctx */) { ...@@ -421,7 +423,10 @@ void innerSignalHandler(int signum, siginfo_t* info, void* /* uctx */) {
gStackTracePrinter->printStackTrace(true); // with symbolization gStackTracePrinter->printStackTrace(true); // with symbolization
// Run user callbacks // 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) { void signalHandler(int signum, siginfo_t* info, void* uctx) {
...@@ -477,7 +482,8 @@ void installFatalSignalHandler() { ...@@ -477,7 +482,8 @@ void installFatalSignalHandler() {
// make sure gFatalSignalCallbackRegistry is created before we // make sure gFatalSignalCallbackRegistry is created before we
// install the fatal signal handler // 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 // If a small sigaltstack is enabled (ex. Rust stdlib might use sigaltstack
// to set a small stack), the default SafeStackTracePrinter would likely // 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