[PATCH] D23046: [asan] Intercept RtlRaiseException instead of kernel32!RaiseException

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 2 13:44:19 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL277518: [asan] Intercept RtlRaiseException instead of kernel32!RaiseException (authored by rnk).

Changed prior to commit:
  https://reviews.llvm.org/D23046?vs=66416&id=66547#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D23046

Files:
  compiler-rt/trunk/lib/asan/asan_win.cc
  compiler-rt/trunk/lib/interception/interception_win.cc
  compiler-rt/trunk/lib/interception/tests/interception_win_test.cc
  compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc

Index: compiler-rt/trunk/lib/asan/asan_win.cc
===================================================================
--- compiler-rt/trunk/lib/asan/asan_win.cc
+++ compiler-rt/trunk/lib/asan/asan_win.cc
@@ -71,10 +71,10 @@
 }  // extern "C"
 
 // ---------------------- Windows-specific interceptors ---------------- {{{
-INTERCEPTOR_WINAPI(void, RaiseException, void *a, void *b, void *c, void *d) {
-  CHECK(REAL(RaiseException));
+INTERCEPTOR_WINAPI(void, RtlRaiseException, void *ExceptionRecord) {
+  CHECK(REAL(RtlRaiseException));
   __asan_handle_no_return();
-  REAL(RaiseException)(a, b, c, d);
+  REAL(RtlRaiseException)(ExceptionRecord);
 }
 
 
@@ -135,7 +135,10 @@
 
 void InitializePlatformInterceptors() {
   ASAN_INTERCEPT_FUNC(CreateThread);
-  ASAN_INTERCEPT_FUNC(RaiseException);
+  // RtlRaiseException is always linked dynamically.
+  CHECK(::__interception::OverrideFunction("RtlRaiseException",
+                                           (uptr)WRAP(RtlRaiseException),
+                                           (uptr *)&REAL(RtlRaiseException)));
 
 #ifdef _WIN64
   ASAN_INTERCEPT_FUNC(__C_specific_handler);
Index: compiler-rt/trunk/lib/interception/interception_win.cc
===================================================================
--- compiler-rt/trunk/lib/interception/interception_win.cc
+++ compiler-rt/trunk/lib/interception/interception_win.cc
@@ -565,6 +565,9 @@
     case 0x24748B:  // 8B 74 24 XX : mov esi, dword ptr [esp + XX]
     case 0x247C8B:  // 8B 7C 24 XX : mov edi, dword ptr [esp + XX]
       return 4;
+
+    case 0x24A48D:  // 8D A4 24 XX XX XX XX : lea esp, [esp + XX XX XX XX]
+      return 7;
   }
 
   switch (*(u32*)address) {
Index: compiler-rt/trunk/lib/interception/tests/interception_win_test.cc
===================================================================
--- compiler-rt/trunk/lib/interception/tests/interception_win_test.cc
+++ compiler-rt/trunk/lib/interception/tests/interception_win_test.cc
@@ -163,6 +163,13 @@
     0x90, 0x90, 0x90, 0x90,
 };
 
+const u8 kPatchableCode5[] = {
+    0x55,                                      // push    ebp
+    0x8b, 0xec,                                // mov     ebp,esp
+    0x8d, 0xa4, 0x24, 0x30, 0xfd, 0xff, 0xff,  // lea     esp,[esp-2D0h]
+    0x54,                                      // push    esp
+};
+
 const u8 kUnpatchableCode1[] = {
     0xC3,                           // ret
 };
@@ -474,6 +481,7 @@
   EXPECT_TRUE(TestFunctionPatching(kPatchableCode3, override));
 #endif
   EXPECT_TRUE(TestFunctionPatching(kPatchableCode4, override));
+  EXPECT_TRUE(TestFunctionPatching(kPatchableCode5, override));
 
   EXPECT_FALSE(TestFunctionPatching(kUnpatchableCode1, override));
   EXPECT_FALSE(TestFunctionPatching(kUnpatchableCode2, override));
Index: compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc
===================================================================
--- compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc
+++ compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc
@@ -24,7 +24,7 @@
 // IMPORT: __asan_wrap_HeapReAlloc
 // IMPORT: __asan_wrap_HeapSize
 // IMPORT: __asan_wrap_CreateThread
-// IMPORT: __asan_wrap_RaiseException
+// IMPORT: __asan_wrap_RtlRaiseException
 //
 // The exception handlers differ in 32-bit and 64-bit, so we ignore them:
 // RUN: grep '[E]XPORT:' %s | sed -e 's/.*[E]XPORT: //' > %t.exported_wrappers3


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23046.66547.patch
Type: text/x-patch
Size: 3392 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160802/67f56f2a/attachment.bin>


More information about the llvm-commits mailing list