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

Side by Side Diff: services/service_manager/runner/host/service_process_launcher.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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "services/service_manager/runner/host/service_process_launcher.h" 5 #include "services/service_manager/runner/host/service_process_launcher.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/base_paths.h" 9 #include "base/base_paths.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 123
124 void ServiceProcessLauncher::DoLaunch( 124 void ServiceProcessLauncher::DoLaunch(
125 std::unique_ptr<base::CommandLine> child_command_line) { 125 std::unique_ptr<base::CommandLine> child_command_line) {
126 if (delegate_) { 126 if (delegate_) {
127 delegate_->AdjustCommandLineArgumentsForTarget(target_, 127 delegate_->AdjustCommandLineArgumentsForTarget(target_,
128 child_command_line.get()); 128 child_command_line.get());
129 } 129 }
130 130
131 base::LaunchOptions options; 131 base::LaunchOptions options;
132 #if defined(OS_WIN) 132 #if defined(OS_WIN)
133 options.handles_to_inherit = &handle_passing_info_; 133 options.handles_to_inherit = handle_passing_info_;
134 #if defined(OFFICIAL_BUILD)
135 CHECK(false) << "Launching mojo process with inherit_handles is insecure!";
136 #endif
137 options.inherit_handles = true;
138 options.stdin_handle = INVALID_HANDLE_VALUE; 134 options.stdin_handle = INVALID_HANDLE_VALUE;
139 options.stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); 135 options.stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
140 options.stderr_handle = GetStdHandle(STD_ERROR_HANDLE); 136 options.stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
141 // Always inherit stdout/stderr as a pair. 137 // Always inherit stdout/stderr as a pair.
142 if (!options.stdout_handle || !options.stdin_handle) 138 if (!options.stdout_handle || !options.stdin_handle)
143 options.stdin_handle = options.stdout_handle = nullptr; 139 options.stdin_handle = options.stdout_handle = nullptr;
144 140
145 // Pseudo handles are used when stdout and stderr redirect to the console. In 141 // Pseudo handles are used when stdout and stderr redirect to the console. In
146 // that case, they're automatically inherited by child processes. See 142 // that case, they're automatically inherited by child processes. See
147 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682075.aspx 143 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682075.aspx
148 // Trying to add them to the list of handles to inherit causes CreateProcess 144 // Trying to add them to the list of handles to inherit causes CreateProcess
149 // to fail. When this process is launched from Python then a real handle is 145 // to fail. When this process is launched from Python then a real handle is
150 // used. In that case, we do want to add it to the list of handles that is 146 // used. In that case, we do want to add it to the list of handles that is
151 // inherited. 147 // inherited.
152 if (options.stdout_handle && 148 if (options.stdout_handle &&
153 GetFileType(options.stdout_handle) != FILE_TYPE_CHAR) { 149 GetFileType(options.stdout_handle) != FILE_TYPE_CHAR) {
154 handle_passing_info_.push_back(options.stdout_handle); 150 options.handles_to_inherit.push_back(options.stdout_handle);
155 } 151 }
156 if (options.stderr_handle && 152 if (options.stderr_handle &&
157 GetFileType(options.stderr_handle) != FILE_TYPE_CHAR && 153 GetFileType(options.stderr_handle) != FILE_TYPE_CHAR &&
158 options.stdout_handle != options.stderr_handle) { 154 options.stdout_handle != options.stderr_handle) {
159 handle_passing_info_.push_back(options.stderr_handle); 155 options.handles_to_inherit.push_back(options.stderr_handle);
160 } 156 }
161 #elif defined(OS_POSIX) 157 #elif defined(OS_POSIX)
162 handle_passing_info_.push_back(std::make_pair(STDIN_FILENO, STDIN_FILENO)); 158 handle_passing_info_.push_back(std::make_pair(STDIN_FILENO, STDIN_FILENO));
163 handle_passing_info_.push_back(std::make_pair(STDOUT_FILENO, STDOUT_FILENO)); 159 handle_passing_info_.push_back(std::make_pair(STDOUT_FILENO, STDOUT_FILENO));
164 handle_passing_info_.push_back(std::make_pair(STDERR_FILENO, STDERR_FILENO)); 160 handle_passing_info_.push_back(std::make_pair(STDERR_FILENO, STDERR_FILENO));
165 options.fds_to_remap = &handle_passing_info_; 161 options.fds_to_remap = handle_passing_info_;
166 #endif 162 #endif
167 DVLOG(2) << "Launching child with command line: " 163 DVLOG(2) << "Launching child with command line: "
168 << child_command_line->GetCommandLineString(); 164 << child_command_line->GetCommandLineString();
169 #if defined(OS_LINUX) 165 #if defined(OS_LINUX)
170 if (start_sandboxed_) { 166 if (start_sandboxed_) {
171 child_process_ = 167 child_process_ =
172 sandbox::NamespaceSandbox::LaunchProcess(*child_command_line, options); 168 sandbox::NamespaceSandbox::LaunchProcess(*child_command_line, options);
173 if (!child_process_.IsValid()) { 169 if (!child_process_.IsValid()) {
174 LOG(ERROR) << "Starting the process with a sandbox failed. Missing kernel" 170 LOG(ERROR) << "Starting the process with a sandbox failed. Missing kernel"
175 << " support."; 171 << " support.";
(...skipping 29 matching lines...) Expand all
205 broker_client_invitation_.Send( 201 broker_client_invitation_.Send(
206 child_process_.Handle(), 202 child_process_.Handle(),
207 mojo::edk::ConnectionParams(mojo::edk::TransportProtocol::kLegacy, 203 mojo::edk::ConnectionParams(mojo::edk::TransportProtocol::kLegacy,
208 mojo_ipc_channel_->PassServerHandle())); 204 mojo_ipc_channel_->PassServerHandle()));
209 } 205 }
210 } 206 }
211 start_child_process_event_.Signal(); 207 start_child_process_event_.Signal();
212 } 208 }
213 209
214 } // namespace service_manager 210 } // namespace service_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698