diff options
author | wfh <wfh@chromium.org> | 2016-01-25 12:12:39 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-25 20:13:58 +0000 |
commit | ffa50a6879c547a73b8813a96a6d8d00448064f1 (patch) | |
tree | bb7b41c2d2d1393112f9ee959249a62bfe8a1a6d /sandbox/win/src/process_policy_test.cc | |
parent | abe355b9079ce4d4a23f8abc36d7efde417c7597 (diff) | |
download | chromium_src-ffa50a6879c547a73b8813a96a6d8d00448064f1.zip chromium_src-ffa50a6879c547a73b8813a96a6d8d00448064f1.tar.gz chromium_src-ffa50a6879c547a73b8813a96a6d8d00448064f1.tar.bz2 |
Make TargetCreateProcessA consistent with TargetCreateProcessW.
Add a test that would previously crash before this CL.
BUG=580916
Review URL: https://codereview.chromium.org/1621413003
Cr-Commit-Position: refs/heads/master@{#371293}
Diffstat (limited to 'sandbox/win/src/process_policy_test.cc')
-rw-r--r-- | sandbox/win/src/process_policy_test.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/sandbox/win/src/process_policy_test.cc b/sandbox/win/src/process_policy_test.cc index 47240a0..3ea2c1f 100644 --- a/sandbox/win/src/process_policy_test.cc +++ b/sandbox/win/src/process_policy_test.cc @@ -243,6 +243,32 @@ SBOX_TESTS_COMMAND int Process_GetChildProcessToken(int argc, wchar_t **argv) { return SBOX_TEST_FAILED; } +// Creates a suspended process using CreateProcessA then kill it. +SBOX_TESTS_COMMAND int Process_CreateProcessA(int argc, wchar_t** argv) { + if (argc != 1) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + + if ((NULL == argv) || (NULL == argv[0])) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + + STARTUPINFOA si = {sizeof(si)}; + + base::string16 path = MakePathToSys(argv[0], false); + + PROCESS_INFORMATION temp_process_info = {}; + // Create suspended to avoid popping calc. + if (!::CreateProcessA(base::SysWideToMultiByte(path, CP_UTF8).c_str(), NULL, + NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, + &temp_process_info)) { + return SBOX_TEST_FAILED; + } + base::win::ScopedProcessInformation pi(temp_process_info); + + if (!::TerminateProcess(pi.process_handle(), 0)) + return SBOX_TEST_FAILED; + + return SBOX_TEST_SUCCEEDED; +} SBOX_TESTS_COMMAND int Process_OpenToken(int argc, wchar_t **argv) { HANDLE token; @@ -384,4 +410,18 @@ TEST(ProcessPolicyTest, TestGetProcessTokenMaxAccessNoJob) { runner.RunTest(L"Process_GetChildProcessToken findstr.exe")); } +TEST(ProcessPolicyTest, TestCreateProcessA) { + TestRunner runner; + sandbox::TargetPolicy* policy = runner.GetPolicy(); + policy->SetJobLevel(JOB_NONE, 0); + policy->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); + + base::string16 exe_path = MakePathToSys(L"calc.exe", false); + ASSERT_TRUE(!exe_path.empty()); + EXPECT_TRUE(runner.AddRule(TargetPolicy::SUBSYS_PROCESS, + TargetPolicy::PROCESS_ALL_EXEC, exe_path.c_str())); + EXPECT_EQ(SBOX_TEST_SUCCEEDED, + runner.RunTest(L"Process_CreateProcessA calc.exe")); +} + } // namespace sandbox |