diff options
| author | Reid Kleckner <rnk@google.com> | 2016-08-02 20:36:29 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2016-08-02 20:36:29 +0000 |
| commit | d6371ea52a99fbca64dbc8d7cfb10a7f14bf3bb0 (patch) | |
| tree | 5d0aaf9a94be98f7b0bc4a2cfb98580c4b7cc6f5 /compiler-rt/lib/interception/tests/interception_win_test.cc | |
| parent | 053826f1465475cf353f526f7ece0e85dcb2e924 (diff) | |
| download | bcm5719-llvm-d6371ea52a99fbca64dbc8d7cfb10a7f14bf3bb0.tar.gz bcm5719-llvm-d6371ea52a99fbca64dbc8d7cfb10a7f14bf3bb0.zip | |
[asan] Intercept RtlRaiseException instead of kernel32!RaiseException
Summary:
On my install of Windows 10, RaiseException is a tail call to
kernelbase!RaiseException. Obviously, we fail to intercept that.
Instead, try hooking at the ntdll!RtlRaiseException layer. It is
unlikely that this layer will contain control flow.
Intercepting at this level requires adding a decoding for
'LEA ESP, [ESP + 0xXXXXXXXX]', which is a really obscure way to write
'SUB ESP, 0xXXXXXXXX' that avoids clobbering EFLAGS.
Reviewers: etienneb
Subscribers: llvm-commits, kubabrecka
Differential Revision: https://reviews.llvm.org/D23046
llvm-svn: 277518
Diffstat (limited to 'compiler-rt/lib/interception/tests/interception_win_test.cc')
| -rw-r--r-- | compiler-rt/lib/interception/tests/interception_win_test.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler-rt/lib/interception/tests/interception_win_test.cc b/compiler-rt/lib/interception/tests/interception_win_test.cc index 611354f03d1..67b40f70146 100644 --- a/compiler-rt/lib/interception/tests/interception_win_test.cc +++ b/compiler-rt/lib/interception/tests/interception_win_test.cc @@ -163,6 +163,13 @@ const u8 kPatchableCode4[] = { 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 @@ TEST(Interception, PatchableFunction) { 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)); |

