| 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 #include "content/zygote/zygote_linux.h" | 5 #include "content/zygote/zygote_linux.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <poll.h> | 9 #include <poll.h> |
| 10 #include <signal.h> | 10 #include <signal.h> |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "base/process/process.h" | 30 #include "base/process/process.h" |
| 31 #include "base/process/process_handle.h" | 31 #include "base/process/process_handle.h" |
| 32 #include "base/time/time.h" | 32 #include "base/time/time.h" |
| 33 #include "base/trace_event/trace_event.h" | 33 #include "base/trace_event/trace_event.h" |
| 34 #include "build/build_config.h" | 34 #include "build/build_config.h" |
| 35 #include "content/common/child_process_sandbox_support_impl_linux.h" | 35 #include "content/common/child_process_sandbox_support_impl_linux.h" |
| 36 #include "content/common/sandbox_linux/sandbox_linux.h" | 36 #include "content/common/sandbox_linux/sandbox_linux.h" |
| 37 #include "content/common/set_process_title.h" | 37 #include "content/common/set_process_title.h" |
| 38 #include "content/common/zygote_commands_linux.h" | 38 #include "content/common/zygote_commands_linux.h" |
| 39 #include "content/public/common/content_descriptors.h" | 39 #include "content/public/common/content_descriptors.h" |
| 40 #include "content/public/common/mojo_channel_switches.h" |
| 40 #include "content/public/common/result_codes.h" | 41 #include "content/public/common/result_codes.h" |
| 41 #include "content/public/common/sandbox_linux.h" | 42 #include "content/public/common/sandbox_linux.h" |
| 42 #include "content/public/common/send_zygote_child_ping_linux.h" | 43 #include "content/public/common/send_zygote_child_ping_linux.h" |
| 43 #include "content/public/common/zygote_fork_delegate_linux.h" | 44 #include "content/public/common/zygote_fork_delegate_linux.h" |
| 44 #include "ipc/ipc_channel.h" | 45 #include "ipc/ipc_channel.h" |
| 45 #include "ipc/ipc_switches.h" | 46 #include "ipc/ipc_switches.h" |
| 46 #include "sandbox/linux/services/credentials.h" | 47 #include "sandbox/linux/services/credentials.h" |
| 47 #include "sandbox/linux/services/namespace_sandbox.h" | 48 #include "sandbox/linux/services/namespace_sandbox.h" |
| 48 | 49 |
| 49 // See https://chromium.googlesource.com/chromium/src/+/master/docs/linux_zygote
.md | 50 // See https://chromium.googlesource.com/chromium/src/+/master/docs/linux_zygote
.md |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 ++i) { | 424 ++i) { |
| 424 if ((*i)->CanHelp(process_type, uma_name, uma_sample, uma_boundary_value)) { | 425 if ((*i)->CanHelp(process_type, uma_name, uma_sample, uma_boundary_value)) { |
| 425 helper = *i; | 426 helper = *i; |
| 426 break; | 427 break; |
| 427 } | 428 } |
| 428 } | 429 } |
| 429 | 430 |
| 430 base::ScopedFD read_pipe, write_pipe; | 431 base::ScopedFD read_pipe, write_pipe; |
| 431 base::ProcessId pid = 0; | 432 base::ProcessId pid = 0; |
| 432 if (helper) { | 433 if (helper) { |
| 433 int ipc_channel_fd = LookUpFd(fd_mapping, kPrimaryIPCChannel); | |
| 434 if (ipc_channel_fd < 0) { | |
| 435 DLOG(ERROR) << "Failed to find kPrimaryIPCChannel in FD mapping"; | |
| 436 return -1; | |
| 437 } | |
| 438 int mojo_channel_fd = LookUpFd(fd_mapping, kMojoIPCChannel); | 434 int mojo_channel_fd = LookUpFd(fd_mapping, kMojoIPCChannel); |
| 439 if (mojo_channel_fd < 0) { | 435 if (mojo_channel_fd < 0) { |
| 440 DLOG(ERROR) << "Failed to find kMojoIPCChannel in FD mapping"; | 436 DLOG(ERROR) << "Failed to find kMojoIPCChannel in FD mapping"; |
| 441 return -1; | 437 return -1; |
| 442 } | 438 } |
| 439 int ipc_channel_fd = LookUpFd(fd_mapping, kPrimaryIPCChannel); |
| 440 DCHECK_EQ(-1, ipc_channel_fd); |
| 443 std::vector<int> fds; | 441 std::vector<int> fds; |
| 444 fds.push_back(ipc_channel_fd); // kBrowserFDIndex | 442 fds.push_back(mojo_channel_fd); // kBrowserFDIndex |
| 445 fds.push_back(pid_oracle.get()); // kPIDOracleFDIndex | 443 fds.push_back(pid_oracle.get()); // kPIDOracleFDIndex |
| 446 fds.push_back(mojo_channel_fd); // kMojoParentFDIndex | |
| 447 pid = helper->Fork(process_type, fds, channel_id); | 444 pid = helper->Fork(process_type, fds, channel_id); |
| 448 | 445 |
| 449 // Helpers should never return in the child process. | 446 // Helpers should never return in the child process. |
| 450 CHECK_NE(pid, 0); | 447 CHECK_NE(pid, 0); |
| 451 } else { | 448 } else { |
| 452 CreatePipe(&read_pipe, &write_pipe); | 449 CreatePipe(&read_pipe, &write_pipe); |
| 453 if (sandbox_flags_ & kSandboxLinuxPIDNS && | 450 if (sandbox_flags_ & kSandboxLinuxPIDNS && |
| 454 sandbox_flags_ & kSandboxLinuxUserNS) { | 451 sandbox_flags_ & kSandboxLinuxUserNS) { |
| 455 pid = sandbox::NamespaceSandbox::ForkInNewPidNamespace( | 452 pid = sandbox::NamespaceSandbox::ForkInNewPidNamespace( |
| 456 /*drop_capabilities_in_child=*/true); | 453 /*drop_capabilities_in_child=*/true); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 std::string* uma_name, | 559 std::string* uma_name, |
| 563 int* uma_sample, | 560 int* uma_sample, |
| 564 int* uma_boundary_value) { | 561 int* uma_boundary_value) { |
| 565 std::vector<std::string> args; | 562 std::vector<std::string> args; |
| 566 int argc = 0; | 563 int argc = 0; |
| 567 int numfds = 0; | 564 int numfds = 0; |
| 568 base::GlobalDescriptors::Mapping mapping; | 565 base::GlobalDescriptors::Mapping mapping; |
| 569 std::string process_type; | 566 std::string process_type; |
| 570 std::string channel_id; | 567 std::string channel_id; |
| 571 const std::string channel_id_prefix = std::string("--") | 568 const std::string channel_id_prefix = std::string("--") |
| 572 + switches::kProcessChannelID + std::string("="); | 569 + switches::kMojoChannelToken + std::string("="); |
| 573 | 570 |
| 574 if (!iter.ReadString(&process_type)) | 571 if (!iter.ReadString(&process_type)) |
| 575 return -1; | 572 return -1; |
| 576 if (!iter.ReadInt(&argc)) | 573 if (!iter.ReadInt(&argc)) |
| 577 return -1; | 574 return -1; |
| 578 | 575 |
| 579 for (int i = 0; i < argc; ++i) { | 576 for (int i = 0; i < argc; ++i) { |
| 580 std::string arg; | 577 std::string arg; |
| 581 if (!iter.ReadString(&arg)) | 578 if (!iter.ReadString(&arg)) |
| 582 return -1; | 579 return -1; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 bool Zygote::HandleGetSandboxStatus(int fd, base::PickleIterator iter) { | 667 bool Zygote::HandleGetSandboxStatus(int fd, base::PickleIterator iter) { |
| 671 if (HANDLE_EINTR(write(fd, &sandbox_flags_, sizeof(sandbox_flags_))) != | 668 if (HANDLE_EINTR(write(fd, &sandbox_flags_, sizeof(sandbox_flags_))) != |
| 672 sizeof(sandbox_flags_)) { | 669 sizeof(sandbox_flags_)) { |
| 673 PLOG(ERROR) << "write"; | 670 PLOG(ERROR) << "write"; |
| 674 } | 671 } |
| 675 | 672 |
| 676 return false; | 673 return false; |
| 677 } | 674 } |
| 678 | 675 |
| 679 } // namespace content | 676 } // namespace content |
| OLD | NEW |