| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "base/strings/stringprintf.h" | 5 #include "base/strings/stringprintf.h" |
| 6 #include "base/win/scoped_handle.h" | 6 #include "base/win/scoped_handle.h" |
| 7 #include "sandbox/win/src/handle_closer_agent.h" | 7 #include "sandbox/win/src/handle_closer_agent.h" |
| 8 #include "sandbox/win/src/nt_internals.h" | 8 #include "sandbox/win/src/nt_internals.h" |
| 9 #include "sandbox/win/src/sandbox.h" | 9 #include "sandbox/win/src/sandbox.h" |
| 10 #include "sandbox/win/src/sandbox_factory.h" | 10 #include "sandbox/win/src/sandbox_factory.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 return SBOX_TEST_FAILED_TO_RUN_TEST; | 79 return SBOX_TEST_FAILED_TO_RUN_TEST; |
| 80 bool should_find = argv[0][0] == L'Y'; | 80 bool should_find = argv[0][0] == L'Y'; |
| 81 if (argv[0][1] != L'\0' || (!should_find && argv[0][0] != L'N')) | 81 if (argv[0][1] != L'\0' || (!should_find && argv[0][0] != L'N')) |
| 82 return SBOX_TEST_FAILED_TO_RUN_TEST; | 82 return SBOX_TEST_FAILED_TO_RUN_TEST; |
| 83 | 83 |
| 84 static int state = BEFORE_INIT; | 84 static int state = BEFORE_INIT; |
| 85 switch (state++) { | 85 switch (state++) { |
| 86 case BEFORE_INIT: | 86 case BEFORE_INIT: |
| 87 // Create a unique marker file that is open while the test is running. | 87 // Create a unique marker file that is open while the test is running. |
| 88 // The handles leak, but it will be closed by the test or on exit. | 88 // The handles leak, but it will be closed by the test or on exit. |
| 89 for (int i = 0; i < arraysize(kFileExtensions); ++i) | 89 for (const wchar_t* kExtension : kFileExtensions) |
| 90 CHECK_NE(GetMarkerFile(kFileExtensions[i]), INVALID_HANDLE_VALUE); | 90 CHECK_NE(GetMarkerFile(kExtension), INVALID_HANDLE_VALUE); |
| 91 return SBOX_TEST_SUCCEEDED; | 91 return SBOX_TEST_SUCCEEDED; |
| 92 | 92 |
| 93 case AFTER_REVERT: { | 93 case AFTER_REVERT: { |
| 94 // Brute force the handle table to find what we're looking for. | 94 // Brute force the handle table to find what we're looking for. |
| 95 DWORD handle_count = UINT_MAX; | 95 DWORD handle_count = UINT_MAX; |
| 96 const int kInvalidHandleThreshold = 100; | 96 const int kInvalidHandleThreshold = 100; |
| 97 const size_t kHandleOffset = 4; // Handles are always a multiple of 4. | 97 const size_t kHandleOffset = 4; // Handles are always a multiple of 4. |
| 98 HANDLE handle = NULL; | 98 HANDLE handle = NULL; |
| 99 int invalid_count = 0; | 99 int invalid_count = 0; |
| 100 base::string16 handle_name; | 100 base::string16 handle_name; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 127 | 127 |
| 128 // Checks that supplied handle is an Event and it's not waitable. | 128 // Checks that supplied handle is an Event and it's not waitable. |
| 129 // Format: CheckForEventHandles | 129 // Format: CheckForEventHandles |
| 130 SBOX_TESTS_COMMAND int CheckForEventHandles(int argc, wchar_t** argv) { | 130 SBOX_TESTS_COMMAND int CheckForEventHandles(int argc, wchar_t** argv) { |
| 131 static int state = BEFORE_INIT; | 131 static int state = BEFORE_INIT; |
| 132 static std::vector<HANDLE> to_check; | 132 static std::vector<HANDLE> to_check; |
| 133 | 133 |
| 134 switch (state++) { | 134 switch (state++) { |
| 135 case BEFORE_INIT: | 135 case BEFORE_INIT: |
| 136 // Create a unique marker file that is open while the test is running. | 136 // Create a unique marker file that is open while the test is running. |
| 137 for (int i = 0; i < arraysize(kFileExtensions); ++i) { | 137 for (const wchar_t* kExtension : kFileExtensions) { |
| 138 HANDLE handle = GetMarkerFile(kFileExtensions[i]); | 138 HANDLE handle = GetMarkerFile(kExtension); |
| 139 CHECK_NE(handle, INVALID_HANDLE_VALUE); | 139 CHECK_NE(handle, INVALID_HANDLE_VALUE); |
| 140 to_check.push_back(handle); | 140 to_check.push_back(handle); |
| 141 } | 141 } |
| 142 return SBOX_TEST_SUCCEEDED; | 142 return SBOX_TEST_SUCCEEDED; |
| 143 | 143 |
| 144 case AFTER_REVERT: | 144 case AFTER_REVERT: |
| 145 for (auto handle : to_check) { | 145 for (auto handle : to_check) { |
| 146 // Set up buffers for the type info and the name. | 146 // Set up buffers for the type info and the name. |
| 147 std::vector<BYTE> type_info_buffer(sizeof(OBJECT_TYPE_INFORMATION) + | 147 std::vector<BYTE> type_info_buffer(sizeof(OBJECT_TYPE_INFORMATION) + |
| 148 32 * sizeof(wchar_t)); | 148 32 * sizeof(wchar_t)); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 | 188 |
| 189 return SBOX_TEST_SUCCEEDED; | 189 return SBOX_TEST_SUCCEEDED; |
| 190 } | 190 } |
| 191 | 191 |
| 192 TEST(HandleCloserTest, CheckForMarkerFiles) { | 192 TEST(HandleCloserTest, CheckForMarkerFiles) { |
| 193 TestRunner runner; | 193 TestRunner runner; |
| 194 runner.SetTimeout(2000); | 194 runner.SetTimeout(2000); |
| 195 runner.SetTestState(EVERY_STATE); | 195 runner.SetTestState(EVERY_STATE); |
| 196 | 196 |
| 197 base::string16 command = base::string16(L"CheckForFileHandles Y"); | 197 base::string16 command = base::string16(L"CheckForFileHandles Y"); |
| 198 for (int i = 0; i < arraysize(kFileExtensions); ++i) { | 198 for (const wchar_t* kExtension : kFileExtensions) { |
| 199 base::string16 handle_name; | 199 base::string16 handle_name; |
| 200 base::win::ScopedHandle marker(GetMarkerFile(kFileExtensions[i])); | 200 base::win::ScopedHandle marker(GetMarkerFile(kExtension)); |
| 201 CHECK(marker.IsValid()); | 201 CHECK(marker.IsValid()); |
| 202 CHECK(sandbox::GetHandleName(marker.Get(), &handle_name)); | 202 CHECK(sandbox::GetHandleName(marker.Get(), &handle_name)); |
| 203 command += (L" "); | 203 command += (L" "); |
| 204 command += handle_name; | 204 command += handle_name; |
| 205 } | 205 } |
| 206 | 206 |
| 207 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(command.c_str())) << | 207 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(command.c_str())) << |
| 208 "Failed: " << command; | 208 "Failed: " << command; |
| 209 } | 209 } |
| 210 | 210 |
| 211 TEST(HandleCloserTest, CloseMarkerFiles) { | 211 TEST(HandleCloserTest, CloseMarkerFiles) { |
| 212 TestRunner runner; | 212 TestRunner runner; |
| 213 runner.SetTimeout(2000); | 213 runner.SetTimeout(2000); |
| 214 runner.SetTestState(EVERY_STATE); | 214 runner.SetTestState(EVERY_STATE); |
| 215 sandbox::TargetPolicy* policy = runner.GetPolicy(); | 215 sandbox::TargetPolicy* policy = runner.GetPolicy(); |
| 216 | 216 |
| 217 base::string16 command = base::string16(L"CheckForFileHandles N"); | 217 base::string16 command = base::string16(L"CheckForFileHandles N"); |
| 218 for (int i = 0; i < arraysize(kFileExtensions); ++i) { | 218 for (const wchar_t* kExtension : kFileExtensions) { |
| 219 base::string16 handle_name; | 219 base::string16 handle_name; |
| 220 base::win::ScopedHandle marker(GetMarkerFile(kFileExtensions[i])); | 220 base::win::ScopedHandle marker(GetMarkerFile(kExtension)); |
| 221 CHECK(marker.IsValid()); | 221 CHECK(marker.IsValid()); |
| 222 CHECK(sandbox::GetHandleName(marker.Get(), &handle_name)); | 222 CHECK(sandbox::GetHandleName(marker.Get(), &handle_name)); |
| 223 CHECK_EQ(policy->AddKernelObjectToClose(L"File", handle_name.c_str()), | 223 CHECK_EQ(policy->AddKernelObjectToClose(L"File", handle_name.c_str()), |
| 224 SBOX_ALL_OK); | 224 SBOX_ALL_OK); |
| 225 command += (L" "); | 225 command += (L" "); |
| 226 command += handle_name; | 226 command += handle_name; |
| 227 } | 227 } |
| 228 | 228 |
| 229 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(command.c_str())) << | 229 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(command.c_str())) << |
| 230 "Failed: " << command; | 230 "Failed: " << command; |
| 231 } | 231 } |
| 232 | 232 |
| 233 TEST(HandleCloserTest, CheckStuffedHandle) { | 233 TEST(HandleCloserTest, CheckStuffedHandle) { |
| 234 TestRunner runner; | 234 TestRunner runner; |
| 235 runner.SetTimeout(2000); | 235 runner.SetTimeout(2000); |
| 236 runner.SetTestState(EVERY_STATE); | 236 runner.SetTestState(EVERY_STATE); |
| 237 sandbox::TargetPolicy* policy = runner.GetPolicy(); | 237 sandbox::TargetPolicy* policy = runner.GetPolicy(); |
| 238 | 238 |
| 239 for (int i = 0; i < arraysize(kFileExtensions); ++i) { | 239 for (const wchar_t* kExtension : kFileExtensions) { |
| 240 base::string16 handle_name; | 240 base::string16 handle_name; |
| 241 base::win::ScopedHandle marker(GetMarkerFile(kFileExtensions[i])); | 241 base::win::ScopedHandle marker(GetMarkerFile(kExtension)); |
| 242 CHECK(marker.IsValid()); | 242 CHECK(marker.IsValid()); |
| 243 CHECK(sandbox::GetHandleName(marker.Get(), &handle_name)); | 243 CHECK(sandbox::GetHandleName(marker.Get(), &handle_name)); |
| 244 CHECK_EQ(policy->AddKernelObjectToClose(L"File", handle_name.c_str()), | 244 CHECK_EQ(policy->AddKernelObjectToClose(L"File", handle_name.c_str()), |
| 245 SBOX_ALL_OK); | 245 SBOX_ALL_OK); |
| 246 } | 246 } |
| 247 | 247 |
| 248 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"CheckForEventHandles")); | 248 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"CheckForEventHandles")); |
| 249 } | 249 } |
| 250 | 250 |
| 251 void WINAPI ThreadPoolTask(void* event, BOOLEAN timeout) { | 251 void WINAPI ThreadPoolTask(void* event, BOOLEAN timeout) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 runner.SetTestState(AFTER_REVERT); | 288 runner.SetTestState(AFTER_REVERT); |
| 289 sandbox::TargetPolicy* policy = runner.GetPolicy(); | 289 sandbox::TargetPolicy* policy = runner.GetPolicy(); |
| 290 | 290 |
| 291 // Sever the CSRSS connection by closing ALPC ports inside the sandbox. | 291 // Sever the CSRSS connection by closing ALPC ports inside the sandbox. |
| 292 CHECK_EQ(policy->AddKernelObjectToClose(L"ALPC Port", NULL), SBOX_ALL_OK); | 292 CHECK_EQ(policy->AddKernelObjectToClose(L"ALPC Port", NULL), SBOX_ALL_OK); |
| 293 | 293 |
| 294 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"RunThreadPool")); | 294 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"RunThreadPool")); |
| 295 } | 295 } |
| 296 | 296 |
| 297 } // namespace sandbox | 297 } // namespace sandbox |
| OLD | NEW |