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 if (base::win::GetVersion() < base::win::VERSION_WIN10) { |
| 191 // This functionality has not been verified on versions before Win10. |
| 192 return; |
| 193 } |
| 194 HANDLE csr_port_handle = sandbox::FindCsrPortHeap(); |
| 195 EXPECT_NE(nullptr, csr_port_handle); |
| 196 } |
| 197 |
| 198 TEST(LpcPolicyTest, TestHeapFlags) { |
| 199 if (base::win::GetVersion() < base::win::VERSION_WIN10) { |
| 200 // This functionality has not been verified on versions before Win10. |
| 201 return; |
| 202 } |
| 203 // Windows does not support callers supplying arbritary flag values. So we |
| 204 // write some non-trivial value to reduce the chance we match this in random |
| 205 // data. |
| 206 DWORD flags = 0x41007; |
| 207 HANDLE heap = HeapCreate(flags, 0, 0); |
| 208 EXPECT_NE(nullptr, heap); |
| 209 DWORD actual_flags = 0; |
| 210 EXPECT_TRUE(sandbox::HeapFlags(heap, &actual_flags)); |
| 211 EXPECT_EQ(flags, actual_flags); |
| 212 EXPECT_TRUE(HeapDestroy(heap)); |
| 213 } |
| 214 |
152 } // namespace sandbox | 215 } // namespace sandbox |
OLD | NEW |