From: Reid Kleckner Date: Thu, 4 Aug 2016 20:05:13 +0000 (+0000) Subject: Avoid re-entrancy between __sanitizer::Report, OutputDebugString, and RtlRaiseException X-Git-Tag: llvmorg-4.0.0-rc1~13297 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c696467530b81c7283d44a1f058ba64a1cfe266d;p=platform%2Fupstream%2Fllvm.git Avoid re-entrancy between __sanitizer::Report, OutputDebugString, and RtlRaiseException Our Report implementation calls OutputDebugString, which calls RtlRaiseException, which can re-enter back into the ASan runtime and cause a hang. Don't treat this special debugger-only exception code as a noreturn event, since the stack won't really unwind all the way. llvm-svn: 277763 --- diff --git a/compiler-rt/lib/asan/asan_win.cc b/compiler-rt/lib/asan/asan_win.cc index cb03821..97a913e 100644 --- a/compiler-rt/lib/asan/asan_win.cc +++ b/compiler-rt/lib/asan/asan_win.cc @@ -71,9 +71,12 @@ void __asan_default_on_error() {} } // extern "C" // ---------------------- Windows-specific interceptors ---------------- {{{ -INTERCEPTOR_WINAPI(void, RtlRaiseException, void *ExceptionRecord) { +INTERCEPTOR_WINAPI(void, RtlRaiseException, EXCEPTION_RECORD *ExceptionRecord) { CHECK(REAL(RtlRaiseException)); - __asan_handle_no_return(); + // This is a noreturn function, unless it's one of the exceptions raised to + // communicate with the debugger, such as the one from OutputDebugString. + if (ExceptionRecord->ExceptionCode != DBG_PRINTEXCEPTION_C) + __asan_handle_no_return(); REAL(RtlRaiseException)(ExceptionRecord); }