@@ -217,26 +217,44 @@ static THREADLOCAL FakeStack *fake_stack_tls;
217217FakeStack *GetTLSFakeStack () {
218218 return fake_stack_tls;
219219}
220- void SetTLSFakeStack (FakeStack *fs) {
220+ void SetTLSFakeStack (AsanThread* t, FakeStack* fs) {
221+ if (fs && !t->IsFakeStackEnabled ()) {
222+ return ;
223+ }
221224 fake_stack_tls = fs;
222225}
223226#else
224227FakeStack *GetTLSFakeStack () { return 0 ; }
225- void SetTLSFakeStack (FakeStack * fs) { }
228+ void SetTLSFakeStack (AsanThread* t, FakeStack* fs) {}
226229#endif // (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_FUCHSIA
227230
228- static FakeStack * GetFakeStack () {
231+ static void DisableFakeStack () {
229232 AsanThread *t = GetCurrentThread ();
230- if (!t) return nullptr ;
233+ if (t) {
234+ t->SetFakeStackEnabled (false );
235+ }
236+ }
237+
238+ static void EnableFakeStack () {
239+ AsanThread* t = GetCurrentThread ();
240+ if (t) {
241+ t->SetFakeStackEnabled (true );
242+ }
243+ }
244+
245+ static FakeStack* GetFakeStack (bool for_allocation = true ) {
246+ AsanThread* t = GetCurrentThread ();
247+ if (!t || (for_allocation && !t->IsFakeStackEnabled ()))
248+ return nullptr ;
231249 return t->get_or_create_fake_stack ();
232250}
233251
234- static FakeStack * GetFakeStackFast () {
252+ static FakeStack* GetFakeStackFast (bool for_allocation = true ) {
235253 if (FakeStack *fs = GetTLSFakeStack ())
236254 return fs;
237255 if (!__asan_option_detect_stack_use_after_return)
238256 return nullptr ;
239- return GetFakeStack ();
257+ return GetFakeStack (for_allocation );
240258}
241259
242260static FakeStack *GetFakeStackFastAlways () {
@@ -311,7 +329,9 @@ extern "C" {
311329// -asan-use-after-return=never, after modal UAR flag lands
312330// (https://github.com/google/sanitizers/issues/1394)
313331SANITIZER_INTERFACE_ATTRIBUTE
314- void *__asan_get_current_fake_stack () { return GetFakeStackFast (); }
332+ void * __asan_get_current_fake_stack () {
333+ return GetFakeStackFast (/* for_allocation=*/ false );
334+ }
315335
316336SANITIZER_INTERFACE_ATTRIBUTE
317337void *__asan_addr_is_in_fake_stack (void *fake_stack, void *addr, void **beg,
@@ -349,4 +369,9 @@ void __asan_allocas_unpoison(uptr top, uptr bottom) {
349369 (reinterpret_cast <void *>(MemToShadow (top)), 0 ,
350370 (bottom - top) / ASAN_SHADOW_GRANULARITY);
351371}
372+
373+ SANITIZER_INTERFACE_ATTRIBUTE
374+ void __asan_disable_fake_stack () { return DisableFakeStack (); }
375+ SANITIZER_INTERFACE_ATTRIBUTE
376+ void __asan_enable_fake_stack () { return EnableFakeStack (); }
352377} // extern "C"
0 commit comments