Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: content/browser/child_process_launcher_helper_mac.cc

Issue 2950153002: Improve process launch handle sharing API. (Closed)
Patch Set: Fix Mojo launcher, review comments Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/feature_list.h" 6 #include "base/feature_list.h"
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/posix/global_descriptors.h" 9 #include "base/posix/global_descriptors.h"
10 #include "content/browser/bootstrap_sandbox_manager_mac.h" 10 #include "content/browser/bootstrap_sandbox_manager_mac.h"
(...skipping 20 matching lines...) Expand all
31 mojo::edk::ScopedPlatformHandle 31 mojo::edk::ScopedPlatformHandle
32 ChildProcessLauncherHelper::PrepareMojoPipeHandlesOnClientThread() { 32 ChildProcessLauncherHelper::PrepareMojoPipeHandlesOnClientThread() {
33 DCHECK_CURRENTLY_ON(client_thread_id_); 33 DCHECK_CURRENTLY_ON(client_thread_id_);
34 return mojo::edk::ScopedPlatformHandle(); 34 return mojo::edk::ScopedPlatformHandle();
35 } 35 }
36 36
37 void ChildProcessLauncherHelper::BeforeLaunchOnClientThread() { 37 void ChildProcessLauncherHelper::BeforeLaunchOnClientThread() {
38 DCHECK_CURRENTLY_ON(client_thread_id_); 38 DCHECK_CURRENTLY_ON(client_thread_id_);
39 } 39 }
40 40
41 std::unique_ptr<FileDescriptorInfo> 41 std::unique_ptr<PosixFileDescriptorInfo>
42 ChildProcessLauncherHelper::GetFilesToMap() { 42 ChildProcessLauncherHelper::GetFilesToMap() {
43 DCHECK_CURRENTLY_ON(BrowserThread::PROCESS_LAUNCHER); 43 DCHECK_CURRENTLY_ON(BrowserThread::PROCESS_LAUNCHER);
44 return CreateDefaultPosixFilesToMap( 44 return CreateDefaultPosixFilesToMap(
45 child_process_id(), mojo_client_handle(), 45 child_process_id(), mojo_client_handle(),
46 false /* include_service_required_files */, GetProcessType(), 46 false /* include_service_required_files */, GetProcessType(),
47 command_line()); 47 command_line());
48 } 48 }
49 49
50 void ChildProcessLauncherHelper::BeforeLaunchOnLauncherThread( 50 void ChildProcessLauncherHelper::BeforeLaunchOnLauncherThread(
51 const FileMappedForLaunch& files_to_register, 51 const FileMappedForLaunch& files_to_register,
52 base::LaunchOptions* options) { 52 base::LaunchOptions* options) {
53 // Convert FD mapping to FileHandleMappingVector. 53 // Convert FD mapping to FileHandleMappingVector.
54 std::unique_ptr<base::FileHandleMappingVector> fds_to_map = 54 options->fds_to_remap = files_to_register.GetMappingWithIDAdjustment(
55 files_to_register.GetMappingWithIDAdjustment( 55 base::GlobalDescriptors::kBaseDescriptor);
56 base::GlobalDescriptors::kBaseDescriptor);
57 56
58 options->environ = delegate_->GetEnvironment(); 57 options->environ = delegate_->GetEnvironment();
59 58
60 if (base::FeatureList::IsEnabled(features::kMacV2Sandbox) && 59 if (base::FeatureList::IsEnabled(features::kMacV2Sandbox) &&
61 GetProcessType() == switches::kRendererProcess) { 60 GetProcessType() == switches::kRendererProcess) {
62 seatbelt_exec_client_ = base::MakeUnique<sandbox::SeatbeltExecClient>(); 61 seatbelt_exec_client_ = base::MakeUnique<sandbox::SeatbeltExecClient>();
63 base::StringPiece renderer_sb = GetContentClient()->GetDataResource( 62 base::StringPiece renderer_sb = GetContentClient()->GetDataResource(
64 IDR_RENDERER_SANDBOX_V2_PROFILE, ui::SCALE_FACTOR_NONE); 63 IDR_RENDERER_SANDBOX_V2_PROFILE, ui::SCALE_FACTOR_NONE);
65 std::string profile = renderer_sb.as_string(); 64 std::string profile = renderer_sb.as_string();
66 65
67 seatbelt_exec_client_->SetProfile(profile); 66 seatbelt_exec_client_->SetProfile(profile);
68 67
69 SetupRendererSandboxParameters(seatbelt_exec_client_.get()); 68 SetupRendererSandboxParameters(seatbelt_exec_client_.get());
70 69
71 int pipe = seatbelt_exec_client_->SendProfileAndGetFD(); 70 int pipe = seatbelt_exec_client_->SendProfileAndGetFD();
72 71
73 base::FilePath helper_executable; 72 base::FilePath helper_executable;
74 CHECK(PathService::Get(content::CHILD_PROCESS_EXE, &helper_executable)); 73 CHECK(PathService::Get(content::CHILD_PROCESS_EXE, &helper_executable));
75 74
76 fds_to_map->push_back(std::make_pair(pipe, pipe)); 75 options->fds_to_remap.push_back(std::make_pair(pipe, pipe));
77 76
78 // Update the command line to enable the V2 sandbox and pass the 77 // Update the command line to enable the V2 sandbox and pass the
79 // communication FD to the helper executable. 78 // communication FD to the helper executable.
80 command_line_->AppendSwitch(switches::kEnableV2Sandbox); 79 command_line_->AppendSwitch(switches::kEnableV2Sandbox);
81 command_line_->AppendArg("--fd_mapping=" + std::to_string(pipe)); 80 command_line_->AppendArg("--fd_mapping=" + std::to_string(pipe));
82 } 81 }
83 82
84 // fds_to_remap will de deleted in AfterLaunchOnLauncherThread() below.
85 options->fds_to_remap = fds_to_map.release();
86
87 // Hold the MachBroker lock for the duration of LaunchProcess. The child will 83 // Hold the MachBroker lock for the duration of LaunchProcess. The child will
88 // send its task port to the parent almost immediately after startup. The Mach 84 // send its task port to the parent almost immediately after startup. The Mach
89 // message will be delivered to the parent, but updating the record of the 85 // message will be delivered to the parent, but updating the record of the
90 // launch will wait until after the placeholder PID is inserted below. This 86 // launch will wait until after the placeholder PID is inserted below. This
91 // ensures that while the child process may send its port to the parent prior 87 // ensures that while the child process may send its port to the parent prior
92 // to the parent leaving LaunchProcess, the order in which the record in 88 // to the parent leaving LaunchProcess, the order in which the record in
93 // MachBroker is updated is correct. 89 // MachBroker is updated is correct.
94 MachBroker* broker = MachBroker::GetInstance(); 90 MachBroker* broker = MachBroker::GetInstance();
95 broker->GetLock().Acquire(); 91 broker->GetLock().Acquire();
96 92
(...skipping 11 matching lines...) Expand all
108 } 104 }
109 } 105 }
110 // options now owns the pre_exec_delegate which will be delete on 106 // options now owns the pre_exec_delegate which will be delete on
111 // AfterLaunchOnLauncherThread below. 107 // AfterLaunchOnLauncherThread below.
112 options->pre_exec_delegate = pre_exec_delegate.release(); 108 options->pre_exec_delegate = pre_exec_delegate.release();
113 } 109 }
114 110
115 ChildProcessLauncherHelper::Process 111 ChildProcessLauncherHelper::Process
116 ChildProcessLauncherHelper::LaunchProcessOnLauncherThread( 112 ChildProcessLauncherHelper::LaunchProcessOnLauncherThread(
117 const base::LaunchOptions& options, 113 const base::LaunchOptions& options,
118 std::unique_ptr<FileDescriptorInfo> files_to_register, 114 std::unique_ptr<PosixFileDescriptorInfo> files_to_register,
119 bool* is_synchronous_launch, 115 bool* is_synchronous_launch,
120 int* launch_result) { 116 int* launch_result) {
121 *is_synchronous_launch = true; 117 *is_synchronous_launch = true;
122 ChildProcessLauncherHelper::Process process; 118 ChildProcessLauncherHelper::Process process;
123 process.process = base::LaunchProcess(*command_line(), options); 119 process.process = base::LaunchProcess(*command_line(), options);
124 *launch_result = process.process.IsValid() ? LAUNCH_RESULT_SUCCESS 120 *launch_result = process.process.IsValid() ? LAUNCH_RESULT_SUCCESS
125 : LAUNCH_RESULT_FAILURE; 121 : LAUNCH_RESULT_FAILURE;
126 return process; 122 return process;
127 } 123 }
128 124
129 void ChildProcessLauncherHelper::AfterLaunchOnLauncherThread( 125 void ChildProcessLauncherHelper::AfterLaunchOnLauncherThread(
130 const ChildProcessLauncherHelper::Process& process, 126 const ChildProcessLauncherHelper::Process& process,
131 const base::LaunchOptions& options) { 127 const base::LaunchOptions& options) {
132 delete options.fds_to_remap;
133
134 std::unique_ptr<sandbox::PreExecDelegate> pre_exec_delegate = 128 std::unique_ptr<sandbox::PreExecDelegate> pre_exec_delegate =
135 base::WrapUnique(static_cast<sandbox::PreExecDelegate*>( 129 base::WrapUnique(static_cast<sandbox::PreExecDelegate*>(
136 options.pre_exec_delegate)); 130 options.pre_exec_delegate));
137 131
138 MachBroker* broker = MachBroker::GetInstance(); 132 MachBroker* broker = MachBroker::GetInstance();
139 if (process.process.IsValid()) { 133 if (process.process.IsValid()) {
140 broker->AddPlaceholderForPid(process.process.Pid(), child_process_id()); 134 broker->AddPlaceholderForPid(process.process.Pid(), child_process_id());
141 } else { 135 } else {
142 if (pre_exec_delegate) { 136 if (pre_exec_delegate) {
143 BootstrapSandboxManager::GetInstance()->sandbox()->RevokeToken( 137 BootstrapSandboxManager::GetInstance()->sandbox()->RevokeToken(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 base::File OpenFileToShare(const base::FilePath& path, 192 base::File OpenFileToShare(const base::FilePath& path,
199 base::MemoryMappedFile::Region* region) { 193 base::MemoryMappedFile::Region* region) {
200 // Not used yet (until required files are described in the service manifest on 194 // Not used yet (until required files are described in the service manifest on
201 // Mac). 195 // Mac).
202 NOTREACHED(); 196 NOTREACHED();
203 return base::File(); 197 return base::File();
204 } 198 }
205 199
206 } // namespace internal 200 } // namespace internal
207 } // namespace content 201 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698