From d4649818767f9bb873e1740b7f50533d438f1985 Mon Sep 17 00:00:00 2001 From: Joshua Peraza Date: Wed, 2 Feb 2022 14:02:27 -0800 Subject: [PATCH] Use atomics in metrics recording terminate handler Accessing static data which requires dynamic initialization produces undefined behavior in signal handlers. Bug: crashpad:384 Change-Id: Ic100c8b34cb61a8ed76bd09e5a1178086d31fd68 Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3433270 Reviewed-by: Mark Mentovai Commit-Queue: Joshua Peraza --- handler/handler_main.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/handler/handler_main.cc b/handler/handler_main.cc index cb78aa16..48ef8b65 100644 --- a/handler/handler_main.cc +++ b/handler/handler_main.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -286,10 +287,10 @@ bool AddKeyValueToMap(std::map* map, // a normal exit, or if a CallMetricsRecordNormalExit object is destroyed after // something else logs an exit event. void MetricsRecordExit(Metrics::LifetimeMilestone milestone) { - [[maybe_unused]] static bool once = [](Metrics::LifetimeMilestone milestone) { + static std::atomic_flag metrics_exit_recorded = ATOMIC_FLAG_INIT; + if (!metrics_exit_recorded.test_and_set()) { Metrics::HandlerLifetimeMilestone(milestone); - return true; - }(milestone); + } } // Calls MetricsRecordExit() to record a failure, and returns EXIT_FAILURE for