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

Side by Side Diff: components/nacl/zygote/nacl_fork_delegate_linux.cc

Issue 240673002: Simplify ZygoteForkDelegate API further (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Don't leak real PID to NaCl child processes Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
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 #include "components/nacl/zygote/nacl_fork_delegate_linux.h" 5 #include "components/nacl/zygote/nacl_fork_delegate_linux.h"
6 6
7 #include <signal.h> 7 #include <signal.h>
8 #include <stdlib.h> 8 #include <stdlib.h>
9 #include <sys/resource.h> 9 #include <sys/resource.h>
10 #include <sys/socket.h> 10 #include <sys/socket.h>
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 if (process_type != switches::kNaClLoaderProcess && 256 if (process_type != switches::kNaClLoaderProcess &&
257 process_type != switches::kNaClLoaderNonSfiProcess) 257 process_type != switches::kNaClLoaderNonSfiProcess)
258 return false; 258 return false;
259 *uma_name = "NaCl.Client.Helper.StateOnFork"; 259 *uma_name = "NaCl.Client.Helper.StateOnFork";
260 *uma_sample = status_; 260 *uma_sample = status_;
261 *uma_boundary_value = kNaClHelperStatusBoundary; 261 *uma_boundary_value = kNaClHelperStatusBoundary;
262 return true; 262 return true;
263 } 263 }
264 264
265 pid_t NaClForkDelegate::Fork(const std::string& process_type, 265 pid_t NaClForkDelegate::Fork(const std::string& process_type,
266 const std::vector<int>& fds) { 266 const std::vector<int>& fds,
267 const std::string& channel_id) {
267 VLOG(1) << "NaClForkDelegate::Fork"; 268 VLOG(1) << "NaClForkDelegate::Fork";
268 269
269 DCHECK(fds.size() == kNumPassedFDs); 270 DCHECK(fds.size() == kNumPassedFDs);
270 271
271 if (status_ != kNaClHelperSuccess) { 272 if (status_ != kNaClHelperSuccess) {
272 LOG(ERROR) << "Cannot launch NaCl process: nacl_helper failed to start"; 273 LOG(ERROR) << "Cannot launch NaCl process: nacl_helper failed to start";
273 return -1; 274 return -1;
274 } 275 }
275 276
276 // First, send a remote fork request. 277 // First, send a remote fork request.
277 Pickle write_pickle; 278 Pickle write_pickle;
278 write_pickle.WriteInt(nacl::kNaClForkRequest); 279 write_pickle.WriteInt(nacl::kNaClForkRequest);
279 // TODO(hamaji): When we split the helper binary for non-SFI mode 280 // TODO(hamaji): When we split the helper binary for non-SFI mode
280 // from nacl_helper, stop sending this information. 281 // from nacl_helper, stop sending this information.
281 const bool uses_nonsfi_mode = 282 const bool uses_nonsfi_mode =
282 process_type == switches::kNaClLoaderNonSfiProcess; 283 process_type == switches::kNaClLoaderNonSfiProcess;
283 write_pickle.WriteBool(uses_nonsfi_mode); 284 write_pickle.WriteBool(uses_nonsfi_mode);
285 write_pickle.WriteString(channel_id);
284 286
285 char reply_buf[kNaClMaxIPCMessageLength]; 287 char reply_buf[kNaClMaxIPCMessageLength];
286 ssize_t reply_size = 0; 288 ssize_t reply_size = 0;
287 bool got_reply = 289 bool got_reply =
288 SendIPCRequestAndReadReply(fd_, fds, write_pickle, 290 SendIPCRequestAndReadReply(fd_, fds, write_pickle,
289 reply_buf, sizeof(reply_buf), &reply_size); 291 reply_buf, sizeof(reply_buf), &reply_size);
290 if (!got_reply) { 292 if (!got_reply) {
291 LOG(ERROR) << "Could not perform remote fork."; 293 LOG(ERROR) << "Could not perform remote fork.";
292 return -1; 294 return -1;
293 } 295 }
294 296
295 // Now see if the other end managed to fork. 297 // Now see if the other end managed to fork.
296 Pickle reply_pickle(reply_buf, reply_size); 298 Pickle reply_pickle(reply_buf, reply_size);
297 PickleIterator iter(reply_pickle); 299 PickleIterator iter(reply_pickle);
298 pid_t nacl_child; 300 pid_t nacl_child;
299 if (!iter.ReadInt(&nacl_child)) { 301 if (!iter.ReadInt(&nacl_child)) {
300 LOG(ERROR) << "NaClForkDelegate::Fork: pickle failed"; 302 LOG(ERROR) << "NaClForkDelegate::Fork: pickle failed";
301 return -1; 303 return -1;
302 } 304 }
303 VLOG(1) << "nacl_child is " << nacl_child; 305 VLOG(1) << "nacl_child is " << nacl_child;
304 return nacl_child; 306 return nacl_child;
305 } 307 }
306 308
307 bool NaClForkDelegate::AckChild(const int fd, const std::string& channel_id) {
308 ssize_t nwritten =
309 HANDLE_EINTR(write(fd, channel_id.c_str(), channel_id.length()));
310 if (static_cast<size_t>(nwritten) != channel_id.length()) {
311 return false;
312 }
313 return true;
314 }
315
316 bool NaClForkDelegate::GetTerminationStatus(pid_t pid, bool known_dead, 309 bool NaClForkDelegate::GetTerminationStatus(pid_t pid, bool known_dead,
317 base::TerminationStatus* status, 310 base::TerminationStatus* status,
318 int* exit_code) { 311 int* exit_code) {
319 VLOG(1) << "NaClForkDelegate::GetTerminationStatus"; 312 VLOG(1) << "NaClForkDelegate::GetTerminationStatus";
320 DCHECK(status); 313 DCHECK(status);
321 DCHECK(exit_code); 314 DCHECK(exit_code);
322 315
323 Pickle write_pickle; 316 Pickle write_pickle;
324 write_pickle.WriteInt(nacl::kNaClGetTerminationStatusRequest); 317 write_pickle.WriteInt(nacl::kNaClGetTerminationStatusRequest);
325 write_pickle.WriteInt(pid); 318 write_pickle.WriteInt(pid);
(...skipping 23 matching lines...) Expand all
349 int remote_exit_code; 342 int remote_exit_code;
350 if (!iter.ReadInt(&remote_exit_code)) { 343 if (!iter.ReadInt(&remote_exit_code)) {
351 LOG(ERROR) << "GetTerminationStatus: pickle failed"; 344 LOG(ERROR) << "GetTerminationStatus: pickle failed";
352 return false; 345 return false;
353 } 346 }
354 347
355 *status = static_cast<base::TerminationStatus>(termination_status); 348 *status = static_cast<base::TerminationStatus>(termination_status);
356 *exit_code = remote_exit_code; 349 *exit_code = remote_exit_code;
357 return true; 350 return true;
358 } 351 }
OLDNEW
« no previous file with comments | « components/nacl/zygote/nacl_fork_delegate_linux.h ('k') | content/public/common/zygote_fork_delegate_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698