Index: sandbox/win/src/lpc_policy_test.cc |
diff --git a/sandbox/win/src/lpc_policy_test.cc b/sandbox/win/src/lpc_policy_test.cc |
index 51931c665e831ebe2e11ae3e9b2a501a8ffca42c..8b8e7453626b8f9dfdb6f0b533e1c37b24d54a67 100644 |
--- a/sandbox/win/src/lpc_policy_test.cc |
+++ b/sandbox/win/src/lpc_policy_test.cc |
@@ -12,6 +12,7 @@ |
#include <winioctl.h> |
#include "base/win/windows_version.h" |
+#include "sandbox/win/src/heap_helper.h" |
#include "sandbox/win/src/sandbox.h" |
#include "sandbox/win/src/sandbox_factory.h" |
#include "sandbox/win/src/sandbox_policy.h" |
@@ -149,4 +150,66 @@ TEST(LpcPolicyTest, GetUserDefaultLocaleName) { |
EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(cmd.c_str())); |
} |
+// Closing ALPC port can invalidate its heap. |
+// Test that all heaps are valid. |
+SBOX_TESTS_COMMAND int Lpc_TestValidProcessHeaps(int argc, wchar_t** argv) { |
+ if (argc != 0) |
+ return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
+ // Retrieves the number of heaps in the current process. |
+ DWORD number_of_heaps = ::GetProcessHeaps(0, NULL); |
+ // Try to retrieve a handle to all the heaps owned by this process. Returns |
+ // false if the number of heaps has changed. |
+ // |
+ // This is inherently racy as is, but it's not something that we observe a lot |
+ // in Chrome, the heaps tend to be created at startup only. |
+ std::unique_ptr<HANDLE[]> all_heaps(new HANDLE[number_of_heaps]); |
+ if (::GetProcessHeaps(number_of_heaps, all_heaps.get()) != number_of_heaps) |
+ return SBOX_TEST_FAILED; |
+ |
+ for (size_t i = 0; i < number_of_heaps; ++i) { |
+ HANDLE handle = all_heaps[i]; |
+ if (!HeapLock(handle)) { |
+ return SBOX_TEST_FAILED; |
+ } |
+ |
+ if (!HeapUnlock(handle)) { |
+ return SBOX_TEST_FAILED; |
+ } |
+ } |
+ return SBOX_TEST_SUCCEEDED; |
+} |
+ |
+TEST(LpcPolicyTest, TestValidProcessHeaps) { |
+ TestRunner runner; |
+ EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Lpc_TestValidProcessHeaps")); |
+} |
+ |
+// All processes should have a shared heap with csrss.exe. This test ensures |
+// that this heap can be found. |
+TEST(LpcPolicyTest, TestCanFindCsrPortHeap) { |
+ if (base::win::GetVersion() < base::win::VERSION_WIN10) { |
+ // This functionality has not been verified on versions before Win10. |
+ return; |
+ } |
+ HANDLE csr_port_handle = sandbox::FindCsrPortHeap(); |
+ EXPECT_NE(nullptr, csr_port_handle); |
+} |
+ |
+TEST(LpcPolicyTest, TestHeapFlags) { |
+ if (base::win::GetVersion() < base::win::VERSION_WIN10) { |
+ // This functionality has not been verified on versions before Win10. |
+ return; |
+ } |
+ // Windows does not support callers supplying arbritary flag values. So we |
+ // write some non-trivial value to reduce the chance we match this in random |
+ // data. |
+ DWORD flags = 0x41007; |
+ HANDLE heap = HeapCreate(flags, 0, 0); |
+ EXPECT_NE(nullptr, heap); |
+ DWORD actual_flags = 0; |
+ EXPECT_TRUE(sandbox::HeapFlags(heap, &actual_flags)); |
+ EXPECT_EQ(flags, actual_flags); |
+ EXPECT_TRUE(HeapDestroy(heap)); |
+} |
+ |
} // namespace sandbox |