Index: lib/asan/asan_win.cc =================================================================== --- lib/asan/asan_win.cc +++ lib/asan/asan_win.cc @@ -154,6 +154,14 @@ asan_thread_start, t, thr_flags, tid); } +INTERCEPTOR_WINAPI(void, NtTerminateThread, void *rcx) { + // Unpoison the terminating thread's stack because the memory may be re-used. + NT_TIB *tib = (NT_TIB *)NtCurrentTeb(); + uptr stackSize = (uptr)tib->StackBase - (uptr)tib->StackLimit; + __asan_unpoison_memory_region(tib->StackLimit, stackSize); + return REAL(NtTerminateThread(rcx)); +} + // }}} namespace __asan { @@ -161,7 +169,9 @@ void InitializePlatformInterceptors() { ASAN_INTERCEPT_FUNC(CreateThread); ASAN_INTERCEPT_FUNC(SetUnhandledExceptionFilter); - + CHECK(::__interception::OverrideFunction("NtTerminateThread", + (uptr)WRAP(NtTerminateThread), + (uptr *)&REAL(NtTerminateThread))); #ifdef _WIN64 ASAN_INTERCEPT_FUNC(__C_specific_handler); #else