@@ -217,17 +217,33 @@ void FakeStack::ForEachFakeFrame(RangeIteratorCallback callback, void* arg) {
217217static THREADLOCAL FakeStack* fake_stack_tls;
218218
219219static FakeStack* GetTLSFakeStack () { return fake_stack_tls; }
220- static void SetTLSFakeStack (FakeStack* fs) { fake_stack_tls = fs; }
220+ static void SetTLSFakeStack (FakeStack* fs) {
221+ fake_stack_tls = fs;
222+ }
221223void ResetTLSFakeStack () { fake_stack_tls = nullptr ; }
222224#else
223225static FakeStack* GetTLSFakeStack () { return nullptr ; }
224- static void SetTLSFakeStack (FakeStack*) {}
226+ static void SetTLSFakeStack (FakeStack* fs ) {}
225227void ResetTLSFakeStack () {}
226228#endif // (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA
227229
230+ static void DisableFakeStack () {
231+ AsanThread* t = GetCurrentThread ();
232+ if (t) {
233+ t->SetFakeStackEnabled (false );
234+ }
235+ }
236+
237+ static void EnableFakeStack () {
238+ AsanThread* t = GetCurrentThread ();
239+ if (t) {
240+ t->SetFakeStackEnabled (true );
241+ }
242+ }
243+
228244static FakeStack* GetFakeStack () {
229245 AsanThread* t = GetCurrentThread ();
230- if (!t)
246+ if (!t || !t-> IsFakeStackEnabled () )
231247 return nullptr ;
232248 return t->get_or_create_fake_stack ();
233249}
@@ -362,4 +378,9 @@ void __asan_allocas_unpoison(uptr top, uptr bottom) {
362378 REAL (memset)(reinterpret_cast <void *>(MemToShadow (top)), 0 ,
363379 (bottom - top) / ASAN_SHADOW_GRANULARITY);
364380}
381+
382+ SANITIZER_INTERFACE_ATTRIBUTE
383+ void __asan_disable_fake_stack () { return DisableFakeStack (); }
384+ SANITIZER_INTERFACE_ATTRIBUTE
385+ void __asan_enable_fake_stack () { return EnableFakeStack (); }
365386} // extern "C"
0 commit comments