| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/browser/zygote_host/zygote_communication_linux.h" | 5 #include "content/browser/zygote_host/zygote_communication_linux.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <sys/socket.h> | 8 #include <sys/socket.h> |
| 9 | 9 |
| 10 #include "base/base_switches.h" | 10 #include "base/base_switches.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 } | 77 } |
| 78 have_read_sandbox_status_word_ = true; | 78 have_read_sandbox_status_word_ = true; |
| 79 UMA_HISTOGRAM_SPARSE_SLOWLY("Linux.SandboxStatus", sandbox_status_); | 79 UMA_HISTOGRAM_SPARSE_SLOWLY("Linux.SandboxStatus", sandbox_status_); |
| 80 } | 80 } |
| 81 | 81 |
| 82 return HANDLE_EINTR(read(control_fd_.get(), buf, buf_len)); | 82 return HANDLE_EINTR(read(control_fd_.get(), buf, buf_len)); |
| 83 } | 83 } |
| 84 | 84 |
| 85 pid_t ZygoteCommunication::ForkRequest( | 85 pid_t ZygoteCommunication::ForkRequest( |
| 86 const std::vector<std::string>& argv, | 86 const std::vector<std::string>& argv, |
| 87 std::unique_ptr<FileDescriptorInfo> mapping, | 87 std::unique_ptr<PosixFileDescriptorInfo> mapping, |
| 88 const std::string& process_type) { | 88 const std::string& process_type) { |
| 89 DCHECK(init_); | 89 DCHECK(init_); |
| 90 | 90 |
| 91 base::Pickle pickle; | 91 base::Pickle pickle; |
| 92 int raw_socks[2]; | 92 int raw_socks[2]; |
| 93 PCHECK(0 == socketpair(AF_UNIX, SOCK_SEQPACKET, 0, raw_socks)); | 93 PCHECK(0 == socketpair(AF_UNIX, SOCK_SEQPACKET, 0, raw_socks)); |
| 94 base::ScopedFD my_sock(raw_socks[0]); | 94 base::ScopedFD my_sock(raw_socks[0]); |
| 95 base::ScopedFD peer_sock(raw_socks[1]); | 95 base::ScopedFD peer_sock(raw_socks[1]); |
| 96 CHECK(base::UnixDomainSocket::EnableReceiveProcessId(my_sock.get())); | 96 CHECK(base::UnixDomainSocket::EnableReceiveProcessId(my_sock.get())); |
| 97 | 97 |
| 98 pickle.WriteInt(kZygoteCommandFork); | 98 pickle.WriteInt(kZygoteCommandFork); |
| 99 pickle.WriteString(process_type); | 99 pickle.WriteString(process_type); |
| 100 pickle.WriteInt(argv.size()); | 100 pickle.WriteInt(argv.size()); |
| 101 for (std::vector<std::string>::const_iterator i = argv.begin(); | 101 for (std::vector<std::string>::const_iterator i = argv.begin(); |
| 102 i != argv.end(); ++i) | 102 i != argv.end(); ++i) |
| 103 pickle.WriteString(*i); | 103 pickle.WriteString(*i); |
| 104 | 104 |
| 105 // Fork requests contain one file descriptor for the PID oracle, and one | 105 // Fork requests contain one file descriptor for the PID oracle, and one |
| 106 // more for each file descriptor mapping for the child process. | 106 // more for each file descriptor mapping for the child process. |
| 107 const size_t num_fds_to_send = 1 + mapping->GetMappingSize(); | 107 const size_t num_fds_to_send = 1 + mapping->GetMappingSize(); |
| 108 pickle.WriteInt(num_fds_to_send); | 108 pickle.WriteInt(num_fds_to_send); |
| 109 | 109 |
| 110 std::vector<int> fds; | 110 std::vector<int> fds; |
| 111 | 111 |
| 112 // First FD to send is peer_sock. | 112 // First FD to send is peer_sock. |
| 113 // TODO(morrita): Ideally, this should be part of the mapping so that | 113 // TODO(morrita): Ideally, this should be part of the mapping so that |
| 114 // FileDescriptorInfo can manages its lifetime. | 114 // PosixFileDescriptorInfo can manages its lifetime. |
| 115 fds.push_back(peer_sock.get()); | 115 fds.push_back(peer_sock.get()); |
| 116 | 116 |
| 117 // The rest come from mapping. | 117 // The rest come from mapping. |
| 118 for (size_t i = 0; i < mapping->GetMappingSize(); ++i) { | 118 for (size_t i = 0; i < mapping->GetMappingSize(); ++i) { |
| 119 pickle.WriteUInt32(mapping->GetIDAt(i)); | 119 pickle.WriteUInt32(mapping->GetIDAt(i)); |
| 120 fds.push_back(mapping->GetFDAt(i)); | 120 fds.push_back(mapping->GetFDAt(i)); |
| 121 } | 121 } |
| 122 | 122 |
| 123 // Sanity check that we've populated |fds| correctly. | 123 // Sanity check that we've populated |fds| correctly. |
| 124 DCHECK_EQ(num_fds_to_send, fds.size()); | 124 DCHECK_EQ(num_fds_to_send, fds.size()); |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 } | 333 } |
| 334 if (ReadSandboxStatus() == -1) { | 334 if (ReadSandboxStatus() == -1) { |
| 335 return 0; | 335 return 0; |
| 336 } | 336 } |
| 337 have_read_sandbox_status_word_ = true; | 337 have_read_sandbox_status_word_ = true; |
| 338 UMA_HISTOGRAM_SPARSE_SLOWLY("Linux.SandboxStatus", sandbox_status_); | 338 UMA_HISTOGRAM_SPARSE_SLOWLY("Linux.SandboxStatus", sandbox_status_); |
| 339 return sandbox_status_; | 339 return sandbox_status_; |
| 340 } | 340 } |
| 341 | 341 |
| 342 } // namespace content | 342 } // namespace content |
| OLD | NEW |