summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2019-04-29 20:44:26 +0000
committerReid Kleckner <rnk@google.com>2019-04-29 20:44:26 +0000
commitd201961150fe163d41c4e0bf9c296ed69780d3b2 (patch)
tree3e424be016b9bddfe443a5492939fe00d3ca7473
parent45fad2fe3524ecee10465b6e20a0e6fc7007121f (diff)
downloadcompiler-rt-d201961150fe163d41c4e0bf9c296ed69780d3b2.tar.gz
Fix FIXME added in r359339
We have windows.h in asan_win.cc, so we can just use the correct prototypes for these EH-related interceptors without worrying. Also fix an unused variable warning while I'm here. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@359500 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/asan/asan_malloc_win.cc1
-rw-r--r--lib/asan/asan_win.cc26
2 files changed, 12 insertions, 15 deletions
diff --git a/lib/asan/asan_malloc_win.cc b/lib/asan/asan_malloc_win.cc
index a45c5a102..b13d798a3 100644
--- a/lib/asan/asan_malloc_win.cc
+++ b/lib/asan/asan_malloc_win.cc
@@ -208,6 +208,7 @@ INTERCEPTOR_WINAPI(LPVOID, HeapReAlloc, HANDLE hHeap, DWORD dwFlags,
LPVOID lpMem, SIZE_T dwBytes) {
GET_STACK_TRACE_MALLOC;
GET_CURRENT_PC_BP_SP;
+ (void)sp;
// Realloc should never reallocate in place.
if (dwFlags & HEAP_REALLOC_IN_PLACE_ONLY)
return nullptr;
diff --git a/lib/asan/asan_win.cc b/lib/asan/asan_win.cc
index adf4d78f5..c9b81fa8f 100644
--- a/lib/asan/asan_win.cc
+++ b/lib/asan/asan_win.cc
@@ -104,7 +104,9 @@ INTERCEPTOR_WINAPI(void, RaiseException, void *a, void *b, void *c, void *d) {
#ifdef _WIN64
-INTERCEPTOR_WINAPI(int, __C_specific_handler, void *a, void *b, void *c, void *d) { // NOLINT
+INTERCEPTOR_WINAPI(EXCEPTION_DISPOSITION, __C_specific_handler,
+ _EXCEPTION_RECORD *a, void *b, _CONTEXT *c,
+ _DISPATCHER_CONTEXT *d) { // NOLINT
CHECK(REAL(__C_specific_handler));
__asan_handle_no_return();
return REAL(__C_specific_handler)(a, b, c, d);
@@ -135,10 +137,9 @@ static thread_return_t THREAD_CALLING_CONV asan_thread_start(void *arg) {
return t->ThreadStart(GetTid(), /* signal_thread_is_registered */ nullptr);
}
-INTERCEPTOR_WINAPI(DWORD, CreateThread,
- void* security, uptr stack_size,
- DWORD (__stdcall *start_routine)(void*), void* arg,
- DWORD thr_flags, void* tid) {
+INTERCEPTOR_WINAPI(HANDLE, CreateThread, LPSECURITY_ATTRIBUTES security,
+ SIZE_T stack_size, LPTHREAD_START_ROUTINE start_routine,
+ void *arg, DWORD thr_flags, DWORD *tid) {
// Strict init-order checking is thread-hostile.
if (flags()->strict_init_order)
StopInitOrderChecking();
@@ -148,9 +149,9 @@ INTERCEPTOR_WINAPI(DWORD, CreateThread,
bool detached = false; // FIXME: how can we determine it on Windows?
u32 current_tid = GetCurrentTidOrInvalid();
AsanThread *t =
- AsanThread::Create(start_routine, arg, current_tid, &stack, detached);
- return REAL(CreateThread)(security, stack_size,
- asan_thread_start, t, thr_flags, tid);
+ AsanThread::Create(start_routine, arg, current_tid, &stack, detached);
+ return REAL(CreateThread)(security, stack_size, asan_thread_start, t,
+ thr_flags, tid);
}
// }}}
@@ -166,16 +167,11 @@ void InitializePlatformInterceptors() {
(LPCWSTR)&InitializePlatformInterceptors,
&pinned));
- // FIXME: ASAN_INTERCEPT_FUNC has some sanity checking that currently does
- // not compile, i.e., it compares `(&CreateThread) != WRAP(&CreateThread)`,
- // but the type of the interceptor does not match.
- // ASAN_INTERCEPT_FUNC(CreateThread);
- INTERCEPT_FUNCTION(CreateThread);
+ ASAN_INTERCEPT_FUNC(CreateThread);
ASAN_INTERCEPT_FUNC(SetUnhandledExceptionFilter);
#ifdef _WIN64
- // ASAN_INTERCEPT_FUNC(__C_specific_handler); // FIXME: same as above
- INTERCEPT_FUNCTION(__C_specific_handler);
+ ASAN_INTERCEPT_FUNC(__C_specific_handler);
#else
ASAN_INTERCEPT_FUNC(_except_handler3);
ASAN_INTERCEPT_FUNC(_except_handler4);