From: Jim Meyering Date: Thu, 15 Sep 2016 23:26:34 +0000 (-0700) Subject: folly/.../ExceptionTracerLib.cpp: provide less DOF fodder (avoid heap use-after-free) X-Git-Tag: v2016.09.19.00~6 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=101b2ad7538bc1a5417b54cf5713d403f9a2eefa;p=folly.git folly/.../ExceptionTracerLib.cpp: provide less DOF fodder (avoid heap use-after-free) Summary: Before this change, an application would fail consistently with a shutdown-time heap use-after-free (i.e., destructor-order-fiasco when one of the following symbols was used after its static-destruction-triggered free): DECLARE_CALLBACK(CxaThrow); DECLARE_CALLBACK(CxaBeginCatch); DECLARE_CALLBACK(CxaRethrow); DECLARE_CALLBACK(CxaEndCatch); DECLARE_CALLBACK(RethrowException); Each of those would define a classic meyers singleton. Since each destructor is trivial, we can fix this by making each a pseudo-leaky (indestructible) meyers singleton instead. Since each static value is never destroyed, it can never cause a DOF error again. Differential Revision: D3870740 fbshipit-source-id: 625f5d5268768ca0e4125bed72bc66c53618be29 --- diff --git a/folly/experimental/exception_tracer/ExceptionTracerLib.cpp b/folly/experimental/exception_tracer/ExceptionTracerLib.cpp index 2d2c0133..2ba97b78 100644 --- a/folly/experimental/exception_tracer/ExceptionTracerLib.cpp +++ b/folly/experimental/exception_tracer/ExceptionTracerLib.cpp @@ -20,6 +20,7 @@ #include +#include #include #include #include @@ -69,13 +70,13 @@ class CallbackHolder { namespace folly { namespace exception_tracer { -#define DECLARE_CALLBACK(NAME) \ - CallbackHolder& get##NAME##Callbacks() { \ - static CallbackHolder Callbacks; \ - return Callbacks; \ - } \ - void register##NAME##Callback(NAME##Type callback) { \ - get##NAME##Callbacks().registerCallback(callback); \ +#define DECLARE_CALLBACK(NAME) \ + CallbackHolder& get##NAME##Callbacks() { \ + static Indestructible> Callbacks; \ + return *Callbacks; \ + } \ + void register##NAME##Callback(NAME##Type callback) { \ + get##NAME##Callbacks().registerCallback(callback); \ } DECLARE_CALLBACK(CxaThrow);