| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #define _CRT_SECURE_NO_WARNINGS | 5 #define _CRT_SECURE_NO_WARNINGS |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 TEST_F(ProcessUtilTest, InheritSpecifiedHandles) { | 477 TEST_F(ProcessUtilTest, InheritSpecifiedHandles) { |
| 478 // Manually create the event, so that it can be inheritable. | 478 // Manually create the event, so that it can be inheritable. |
| 479 SECURITY_ATTRIBUTES security_attributes = {}; | 479 SECURITY_ATTRIBUTES security_attributes = {}; |
| 480 security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes)); | 480 security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes)); |
| 481 security_attributes.lpSecurityDescriptor = NULL; | 481 security_attributes.lpSecurityDescriptor = NULL; |
| 482 security_attributes.bInheritHandle = true; | 482 security_attributes.bInheritHandle = true; |
| 483 | 483 |
| 484 // Takes ownership of the event handle. | 484 // Takes ownership of the event handle. |
| 485 base::WaitableEvent event(base::win::ScopedHandle( | 485 base::WaitableEvent event(base::win::ScopedHandle( |
| 486 CreateEvent(&security_attributes, true, false, NULL))); | 486 CreateEvent(&security_attributes, true, false, NULL))); |
| 487 base::HandlesToInheritVector handles_to_inherit; | |
| 488 handles_to_inherit.push_back(event.handle()); | |
| 489 base::LaunchOptions options; | 487 base::LaunchOptions options; |
| 490 options.handles_to_inherit = &handles_to_inherit; | 488 options.handles_to_inherit.push_back(event.handle()); |
| 491 | 489 |
| 492 base::CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess"); | 490 base::CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess"); |
| 493 cmd_line.AppendSwitchASCII( | 491 cmd_line.AppendSwitchASCII( |
| 494 kEventToTriggerHandleSwitch, | 492 kEventToTriggerHandleSwitch, |
| 495 base::Uint64ToString(reinterpret_cast<uint64_t>(event.handle()))); | 493 base::Uint64ToString(reinterpret_cast<uint64_t>(event.handle()))); |
| 496 | 494 |
| 497 // This functionality actually requires Vista or later. Make sure that it | 495 // This functionality actually requires Vista or later. Make sure that it |
| 498 // fails properly on XP. | 496 // fails properly on XP. |
| 499 if (base::win::GetVersion() < base::win::VERSION_VISTA) { | 497 if (base::win::GetVersion() < base::win::VERSION_VISTA) { |
| 500 EXPECT_FALSE(base::LaunchProcess(cmd_line, options).IsValid()); | 498 EXPECT_FALSE(base::LaunchProcess(cmd_line, options).IsValid()); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 DPCHECK(ret == 0); | 622 DPCHECK(ret == 0); |
| 625 | 623 |
| 626 return 0; | 624 return 0; |
| 627 } | 625 } |
| 628 | 626 |
| 629 int ProcessUtilTest::CountOpenFDsInChild() { | 627 int ProcessUtilTest::CountOpenFDsInChild() { |
| 630 int fds[2]; | 628 int fds[2]; |
| 631 if (pipe(fds) < 0) | 629 if (pipe(fds) < 0) |
| 632 NOTREACHED(); | 630 NOTREACHED(); |
| 633 | 631 |
| 634 base::FileHandleMappingVector fd_mapping_vec; | |
| 635 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe)); | |
| 636 base::LaunchOptions options; | 632 base::LaunchOptions options; |
| 637 options.fds_to_remap = &fd_mapping_vec; | 633 options.fds_to_remap.push_back(std::pair<int, int>(fds[1], kChildPipe)); |
| 638 base::SpawnChildResult spawn_child = | 634 base::SpawnChildResult spawn_child = |
| 639 SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options); | 635 SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options); |
| 640 CHECK(spawn_child.process.IsValid()); | 636 CHECK(spawn_child.process.IsValid()); |
| 641 int ret = IGNORE_EINTR(close(fds[1])); | 637 int ret = IGNORE_EINTR(close(fds[1])); |
| 642 DPCHECK(ret == 0); | 638 DPCHECK(ret == 0); |
| 643 | 639 |
| 644 // Read number of open files in client process from pipe; | 640 // Read number of open files in client process from pipe; |
| 645 int num_open_files = -1; | 641 int num_open_files = -1; |
| 646 ssize_t bytes_read = | 642 ssize_t bytes_read = |
| 647 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); | 643 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 691 ret = IGNORE_EINTR(close(dev_null)); | 687 ret = IGNORE_EINTR(close(dev_null)); |
| 692 DPCHECK(ret == 0); | 688 DPCHECK(ret == 0); |
| 693 } | 689 } |
| 694 | 690 |
| 695 namespace { | 691 namespace { |
| 696 | 692 |
| 697 std::string TestLaunchProcess(const std::vector<std::string>& args, | 693 std::string TestLaunchProcess(const std::vector<std::string>& args, |
| 698 const base::EnvironmentMap& env_changes, | 694 const base::EnvironmentMap& env_changes, |
| 699 const bool clear_environ, | 695 const bool clear_environ, |
| 700 const int clone_flags) { | 696 const int clone_flags) { |
| 701 base::FileHandleMappingVector fds_to_remap; | |
| 702 | |
| 703 int fds[2]; | 697 int fds[2]; |
| 704 PCHECK(pipe(fds) == 0); | 698 PCHECK(pipe(fds) == 0); |
| 705 | 699 |
| 706 fds_to_remap.push_back(std::make_pair(fds[1], 1)); | |
| 707 base::LaunchOptions options; | 700 base::LaunchOptions options; |
| 708 options.wait = true; | 701 options.wait = true; |
| 709 options.environ = env_changes; | 702 options.environ = env_changes; |
| 710 options.clear_environ = clear_environ; | 703 options.clear_environ = clear_environ; |
| 711 options.fds_to_remap = &fds_to_remap; | 704 options.fds_to_remap.push_back(std::make_pair(fds[1], 1)); |
| 712 #if defined(OS_LINUX) | 705 #if defined(OS_LINUX) |
| 713 options.clone_flags = clone_flags; | 706 options.clone_flags = clone_flags; |
| 714 #else | 707 #else |
| 715 CHECK_EQ(0, clone_flags); | 708 CHECK_EQ(0, clone_flags); |
| 716 #endif // defined(OS_LINUX) | 709 #endif // defined(OS_LINUX) |
| 717 EXPECT_TRUE(base::LaunchProcess(args, options).IsValid()); | 710 EXPECT_TRUE(base::LaunchProcess(args, options).IsValid()); |
| 718 PCHECK(IGNORE_EINTR(close(fds[1])) == 0); | 711 PCHECK(IGNORE_EINTR(close(fds[1])) == 0); |
| 719 | 712 |
| 720 char buf[512]; | 713 char buf[512]; |
| 721 const ssize_t n = HANDLE_EINTR(read(fds[0], buf, sizeof(buf))); | 714 const ssize_t n = HANDLE_EINTR(read(fds[0], buf, sizeof(buf))); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 int fd_; | 938 int fd_; |
| 946 DISALLOW_COPY_AND_ASSIGN(ReadFromPipeDelegate); | 939 DISALLOW_COPY_AND_ASSIGN(ReadFromPipeDelegate); |
| 947 }; | 940 }; |
| 948 | 941 |
| 949 TEST_F(ProcessUtilTest, PreExecHook) { | 942 TEST_F(ProcessUtilTest, PreExecHook) { |
| 950 int pipe_fds[2]; | 943 int pipe_fds[2]; |
| 951 ASSERT_EQ(0, pipe(pipe_fds)); | 944 ASSERT_EQ(0, pipe(pipe_fds)); |
| 952 | 945 |
| 953 base::ScopedFD read_fd(pipe_fds[0]); | 946 base::ScopedFD read_fd(pipe_fds[0]); |
| 954 base::ScopedFD write_fd(pipe_fds[1]); | 947 base::ScopedFD write_fd(pipe_fds[1]); |
| 955 base::FileHandleMappingVector fds_to_remap; | |
| 956 fds_to_remap.push_back(std::make_pair(read_fd.get(), read_fd.get())); | |
| 957 | 948 |
| 958 ReadFromPipeDelegate read_from_pipe_delegate(read_fd.get()); | 949 ReadFromPipeDelegate read_from_pipe_delegate(read_fd.get()); |
| 959 base::LaunchOptions options; | 950 base::LaunchOptions options; |
| 960 options.fds_to_remap = &fds_to_remap; | 951 options.fds_to_remap.push_back(std::make_pair(read_fd.get(), read_fd.get())); |
| 961 options.pre_exec_delegate = &read_from_pipe_delegate; | 952 options.pre_exec_delegate = &read_from_pipe_delegate; |
| 962 base::SpawnChildResult spawn_child = | 953 base::SpawnChildResult spawn_child = |
| 963 SpawnChildWithOptions("SimpleChildProcess", options); | 954 SpawnChildWithOptions("SimpleChildProcess", options); |
| 964 ASSERT_TRUE(spawn_child.process.IsValid()); | 955 ASSERT_TRUE(spawn_child.process.IsValid()); |
| 965 | 956 |
| 966 read_fd.reset(); | 957 read_fd.reset(); |
| 967 ASSERT_EQ(1, HANDLE_EINTR(write(write_fd.get(), &kPipeValue, 1))); | 958 ASSERT_EQ(1, HANDLE_EINTR(write(write_fd.get(), &kPipeValue, 1))); |
| 968 | 959 |
| 969 int exit_code = 42; | 960 int exit_code = 42; |
| 970 EXPECT_TRUE(spawn_child.process.WaitForExit(&exit_code)); | 961 EXPECT_TRUE(spawn_child.process.WaitForExit(&exit_code)); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 | 1030 |
| 1040 base::SpawnChildResult spawn_child = | 1031 base::SpawnChildResult spawn_child = |
| 1041 SpawnChildWithOptions("SimpleChildProcess", options); | 1032 SpawnChildWithOptions("SimpleChildProcess", options); |
| 1042 ASSERT_TRUE(spawn_child.process.IsValid()); | 1033 ASSERT_TRUE(spawn_child.process.IsValid()); |
| 1043 | 1034 |
| 1044 int exit_code = kSuccess; | 1035 int exit_code = kSuccess; |
| 1045 EXPECT_TRUE(spawn_child.process.WaitForExit(&exit_code)); | 1036 EXPECT_TRUE(spawn_child.process.WaitForExit(&exit_code)); |
| 1046 EXPECT_NE(kSuccess, exit_code); | 1037 EXPECT_NE(kSuccess, exit_code); |
| 1047 } | 1038 } |
| 1048 #endif // defined(OS_LINUX) | 1039 #endif // defined(OS_LINUX) |
| OLD | NEW |