зеркало из https://github.com/mozilla/gecko-dev.git
35 строки
1.3 KiB
Diff
35 строки
1.3 KiB
Diff
[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
|
|
|
|
--- a/compiler-rt/lib/asan/asan_win.cc (revision 342651)
|
|
+++ b/compiler-rt/lib/asan/asan_win.cc (revision 342652)
|
|
@@ -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 {
|
|
@@ -169,7 +177,9 @@
|
|
|
|
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
|