[compiler-rt] r305581 - [WinASan] Fix hotpatching new Win 10 build 1703 x64 strnlen prologue

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 16 13:44:00 PDT 2017


Author: rnk
Date: Fri Jun 16 15:44:00 2017
New Revision: 305581

URL: http://llvm.org/viewvc/llvm-project?rev=305581&view=rev
Log:
[WinASan] Fix hotpatching new Win 10 build 1703 x64 strnlen prologue

The first instruction of the new ucrtbase!strnlen implementation loads a
global, presumably to dispatch between SSE and non-SSE optimized strnlen
implementations.

Fixes PR32895 and probably
https://github.com/google/sanitizers/issues/818

Modified:
    compiler-rt/trunk/lib/interception/interception_win.cc
    compiler-rt/trunk/lib/interception/tests/interception_win_test.cc

Modified: compiler-rt/trunk/lib/interception/interception_win.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/interception/interception_win.cc?rev=305581&r1=305580&r2=305581&view=diff
==============================================================================
--- compiler-rt/trunk/lib/interception/interception_win.cc (original)
+++ compiler-rt/trunk/lib/interception/interception_win.cc Fri Jun 16 15:44:00 2017
@@ -477,7 +477,7 @@ static size_t GetInstructionSize(uptr ad
   switch (*(u8*)address) {
     case 0xA1:  // A1 XX XX XX XX XX XX XX XX :
                 //   movabs eax, dword ptr ds:[XXXXXXXX]
-      return 8;
+      return 9;
   }
 
   switch (*(u16*)address) {
@@ -495,6 +495,11 @@ static size_t GetInstructionSize(uptr ad
     case 0x5741:  // push r15
     case 0x9066:  // Two-byte NOP
       return 2;
+
+    case 0x058B:  // 8B 05 XX XX XX XX : mov eax, dword ptr [XX XX XX XX]
+      if (rel_offset)
+        *rel_offset = 2;
+      return 6;
   }
 
   switch (0x00FFFFFF & *(u32*)address) {

Modified: compiler-rt/trunk/lib/interception/tests/interception_win_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/interception/tests/interception_win_test.cc?rev=305581&r1=305580&r2=305581&view=diff
==============================================================================
--- compiler-rt/trunk/lib/interception/tests/interception_win_test.cc (original)
+++ compiler-rt/trunk/lib/interception/tests/interception_win_test.cc Fri Jun 16 15:44:00 2017
@@ -170,6 +170,13 @@ const u8 kPatchableCode5[] = {
     0x54,                                      // push    esp
 };
 
+#if SANITIZER_WINDOWS64
+u8 kLoadGlobalCode[] = {
+  0x8B, 0x05, 0x00, 0x00, 0x00, 0x00, // mov    eax [rip + global]
+  0xC3,                               // ret
+};
+#endif
+
 const u8 kUnpatchableCode1[] = {
     0xC3,                           // ret
 };
@@ -502,6 +509,10 @@ TEST(Interception, PatchableFunction) {
   EXPECT_TRUE(TestFunctionPatching(kPatchableCode4, override));
   EXPECT_TRUE(TestFunctionPatching(kPatchableCode5, override));
 
+#if SANITIZER_WINDOWS64
+  EXPECT_TRUE(TestFunctionPatching(kLoadGlobalCode, override));
+#endif
+
   EXPECT_FALSE(TestFunctionPatching(kUnpatchableCode1, override));
   EXPECT_FALSE(TestFunctionPatching(kUnpatchableCode2, override));
   EXPECT_FALSE(TestFunctionPatching(kUnpatchableCode3, override));




More information about the llvm-commits mailing list