From 468f53b58c620031c11e47b3c3f27271797b0771 Mon Sep 17 00:00:00 2001 From: David Major Date: Thu, 20 Sep 2018 14:59:33 +0000 Subject: [PATCH] [winasan] Unpoison the stack in NtTerminateThread In long-running builds we've seen some ASan complaints during thread creation that we suspect are due to leftover poisoning from previous threads whose stacks occupied that memory. This patch adds a hook that unpoisons the stack just before the NtTerminateThread syscall. Differential Revision: https://reviews.llvm.org/D52091 llvm-svn: 342652 --- compiler-rt/lib/asan/asan_win.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/asan/asan_win.cc b/compiler-rt/lib/asan/asan_win.cc index 67125d3..3b6424e 100644 --- a/compiler-rt/lib/asan/asan_win.cc +++ b/compiler-rt/lib/asan/asan_win.cc @@ -154,6 +154,14 @@ INTERCEPTOR_WINAPI(DWORD, CreateThread, 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 @@ namespace __asan { 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 -- 2.7.4