Re-land r343606 "[winasan] Unpoison the stack in NtTerminateThread"

This change was reverted because it caused some nacl tests in chromium
to fail. I attempted to reproduce those problems locally, but I was
unable to. Let's reland this and let Chromium's test infrastructure
discover any problems.

llvm-svn: 346560
This commit is contained in:
Reid Kleckner 2018-11-09 22:06:59 +00:00
parent ed15d93fcc
commit 6c0bb3758e
2 changed files with 12 additions and 1 deletions

View File

@ -154,6 +154,14 @@ INTERCEPTOR_WINAPI(DWORD, CreateThread,
asan_thread_start, t, thr_flags, tid);
}
INTERCEPTOR_WINAPI(LONG, NtTerminateThread, HANDLE handle, LONG status) {
// 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(handle, status));
}
// }}}
namespace __asan {
@ -169,7 +177,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

View File

@ -29,6 +29,7 @@
// IMPORT: __asan_wrap_HeapReAlloc
// IMPORT: __asan_wrap_HeapSize
// IMPORT: __asan_wrap_CreateThread
// IMPORT: __asan_wrap_NtTerminateThread
// IMPORT: __asan_wrap_RaiseException
// IMPORT: __asan_wrap_RtlRaiseException
// IMPORT: __asan_wrap_SetUnhandledExceptionFilter