Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // These tests have been added to specifically tests issues arising from (A)LPC | 5 // These tests have been added to specifically tests issues arising from (A)LPC |
| 6 // lock down. | 6 // lock down. |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <cctype> | 9 #include <cctype> |
| 10 | 10 |
| 11 #include <windows.h> | 11 #include <windows.h> |
| 12 #include <winioctl.h> | 12 #include <winioctl.h> |
| 13 | 13 |
| 14 #include "base/win/windows_version.h" | 14 #include "base/win/windows_version.h" |
| 15 #include "sandbox/win/src/heap_helper.h" | |
| 15 #include "sandbox/win/src/sandbox.h" | 16 #include "sandbox/win/src/sandbox.h" |
| 16 #include "sandbox/win/src/sandbox_factory.h" | 17 #include "sandbox/win/src/sandbox_factory.h" |
| 17 #include "sandbox/win/src/sandbox_policy.h" | 18 #include "sandbox/win/src/sandbox_policy.h" |
| 18 #include "sandbox/win/tests/common/controller.h" | 19 #include "sandbox/win/tests/common/controller.h" |
| 19 #include "sandbox/win/tests/common/test_utils.h" | 20 #include "sandbox/win/tests/common/test_utils.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 22 |
| 22 namespace sandbox { | 23 namespace sandbox { |
| 23 | 24 |
| 24 // Converts LCID to std::wstring for passing to sbox tests. | 25 // Converts LCID to std::wstring for passing to sbox tests. |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 wchar_t locale_name[LOCALE_NAME_MAX_LENGTH] = {0}; | 143 wchar_t locale_name[LOCALE_NAME_MAX_LENGTH] = {0}; |
| 143 EXPECT_NE(0, GetUserDefaultLocaleName_func( | 144 EXPECT_NE(0, GetUserDefaultLocaleName_func( |
| 144 locale_name, LOCALE_NAME_MAX_LENGTH * sizeof(wchar_t))); | 145 locale_name, LOCALE_NAME_MAX_LENGTH * sizeof(wchar_t))); |
| 145 EXPECT_NE(0U, wcsnlen(locale_name, LOCALE_NAME_MAX_LENGTH)); | 146 EXPECT_NE(0U, wcsnlen(locale_name, LOCALE_NAME_MAX_LENGTH)); |
| 146 std::wstring cmd = | 147 std::wstring cmd = |
| 147 L"Lpc_GetUserDefaultLocaleName " + std::wstring(locale_name); | 148 L"Lpc_GetUserDefaultLocaleName " + std::wstring(locale_name); |
| 148 TestRunner runner; | 149 TestRunner runner; |
| 149 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(cmd.c_str())); | 150 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(cmd.c_str())); |
| 150 } | 151 } |
| 151 | 152 |
| 153 // Closing ALPC port can invalidate its heap. | |
| 154 // Test that all heaps are valid. | |
| 155 SBOX_TESTS_COMMAND int Lpc_TestValidProcessHeaps(int argc, wchar_t** argv) { | |
| 156 if (argc != 0) | |
| 157 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
| 158 // Retrieves the number of heaps in the current process. | |
| 159 DWORD number_of_heaps = ::GetProcessHeaps(0, NULL); | |
| 160 // Try to retrieve a handle to all the heaps owned by this process. Returns | |
| 161 // false if the number of heaps has changed. | |
| 162 // | |
| 163 // This is inherently racy as is, but it's not something that we observe a lot | |
| 164 // in Chrome, the heaps tend to be created at startup only. | |
| 165 std::unique_ptr<HANDLE[]> all_heaps(new HANDLE[number_of_heaps]); | |
| 166 if (::GetProcessHeaps(number_of_heaps, all_heaps.get()) != number_of_heaps) | |
| 167 return SBOX_TEST_FAILED; | |
| 168 | |
| 169 for (size_t i = 0; i < number_of_heaps; ++i) { | |
| 170 HANDLE handle = all_heaps[i]; | |
| 171 if (!HeapLock(handle)) { | |
| 172 return SBOX_TEST_FAILED; | |
| 173 } | |
| 174 | |
| 175 if (!HeapUnlock(handle)) { | |
| 176 return SBOX_TEST_FAILED; | |
| 177 } | |
| 178 } | |
| 179 return SBOX_TEST_SUCCEEDED; | |
| 180 } | |
| 181 | |
| 182 TEST(LpcPolicyTest, TestValidProcessHeaps) { | |
| 183 TestRunner runner; | |
| 184 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Lpc_TestValidProcessHeaps")); | |
| 185 } | |
| 186 | |
| 187 // All processes should have a shared heap with csrss.exe. This test ensures | |
| 188 // that this heap can be found. | |
| 189 TEST(LpcPolicyTest, TestCanFindCsrPortHeap) { | |
| 190 HANDLE csr_port_handle = sandbox::FindCsrPortHeap(); | |
| 191 EXPECT_NE(nullptr, csr_port_handle); | |
| 192 } | |
| 193 | |
| 194 TEST(LpcPolicyTest, TestHeapFlags) { | |
|
Will Harris
2017/03/22 19:21:49
nice test!
liamjm (20p)
2017/04/14 17:27:20
Acknowledged.
| |
| 195 // Windows does not support callers supplying arbritary flag values. So we | |
| 196 // write some non-trivial value to reduce the chance we match this in random | |
| 197 // data. | |
| 198 DWORD flags = 0x41007; | |
| 199 HANDLE heap = HeapCreate(flags, 0, 0); | |
| 200 EXPECT_NE(nullptr, heap); | |
| 201 DWORD actual_flags = sandbox::HeapFlags(heap); | |
| 202 EXPECT_EQ(flags, actual_flags); | |
| 203 EXPECT_TRUE(HeapDestroy(heap)); | |
| 204 } | |
| 205 | |
| 152 } // namespace sandbox | 206 } // namespace sandbox |
| OLD | NEW |