Chromium Code Reviews| Index: sandbox/win/src/service_resolver_unittest.cc |
| diff --git a/sandbox/win/src/service_resolver_unittest.cc b/sandbox/win/src/service_resolver_unittest.cc |
| index 59105cc49defa6b55a343c576354edbf2828979c..b8167d5d73d0edb40ca0c02baf5c522a5811365b 100644 |
| --- a/sandbox/win/src/service_resolver_unittest.cc |
| +++ b/sandbox/win/src/service_resolver_unittest.cc |
| @@ -44,7 +44,7 @@ class ResolverThunkTest : public T { |
| EXPECT_EQ(STATUS_SUCCESS, ret); |
| target_ = fake_target_; |
| - ntdll_base_ = ::GetModuleHandle(L"ntdll.dll"); |
| + |
| return ret; |
| }; |
| @@ -108,6 +108,8 @@ NTSTATUS PatchNtdllWithResolver(const char* function, bool relaxed, |
| scoped_ptr<char[]> thunk(new char[thunk_size]); |
| size_t used; |
| + resolver->AllowLocalPatches(); |
| + |
| NTSTATUS ret = resolver->Setup(ntdll_base, NULL, function, NULL, |
| function_entry, thunk.get(), thunk_size, |
| &used); |
| @@ -224,4 +226,41 @@ TEST(ServiceResolverTest, MultiplePatchedServices) { |
| #endif |
| } |
| +TEST(ServiceResolverTest, LocalPatchesAllowed) { |
| + sandbox::ServiceResolverThunk* resolver = GetTestResolver(true); |
| + |
| + HMODULE ntdll_base = ::GetModuleHandle(L"ntdll.dll"); |
| + ASSERT_TRUE(NULL != ntdll_base); |
| + |
| + const char kFunctionName[] = "NtClose"; |
| + |
| + void* target = ::GetProcAddress(ntdll_base, kFunctionName); |
| + ASSERT_TRUE(NULL != target); |
| + |
| + BYTE service[50]; |
| + memcpy(service, target, sizeof(service)); |
| + static_cast<WinXpResolverTest*>(resolver)->set_target(service); |
| + |
| + // Any pointer will do as an interception_entry_point |
| + void* function_entry = resolver; |
| + size_t thunk_size = resolver->GetThunkSize(); |
| + scoped_ptr<char[]> thunk(new char[thunk_size]); |
| + size_t used; |
| + |
| + NTSTATUS ret = STATUS_UNSUCCESSFUL; |
| + |
| + // First try patching without having allowed local patches. |
| + ret = resolver->Setup(ntdll_base, NULL, kFunctionName, NULL, |
| + function_entry, thunk.get(), thunk_size, |
| + &used); |
| + EXPECT_FALSE(NT_SUCCESS(ret)); |
| + |
| + // Now allow local patches and check that things work. |
| + resolver->AllowLocalPatches(); |
| + ret = resolver->Setup(ntdll_base, NULL, kFunctionName, NULL, |
| + function_entry, thunk.get(), thunk_size, |
| + &used); |
|
cpu_(ooo_6.6-7.5)
2013/11/29 18:30:07
indenting
robertshield
2013/11/29 19:29:08
Done.
|
| + EXPECT_EQ(STATUS_SUCCESS, ret); |
| +} |
| + |
| } // namespace |