| 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 <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 #include <sys/socket.h> | 9 #include <sys/socket.h> |
| 10 #include <sys/types.h> | 10 #include <sys/types.h> |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 // A SOCK_DGRAM is installed in fd 5. This is the sandbox IPC channel. | 99 // A SOCK_DGRAM is installed in fd 5. This is the sandbox IPC channel. |
| 100 // See http://code.google.com/p/chromium/wiki/LinuxSandboxIPC | 100 // See http://code.google.com/p/chromium/wiki/LinuxSandboxIPC |
| 101 | 101 |
| 102 // We need to accept SIGCHLD, even though our handler is a no-op because | 102 // We need to accept SIGCHLD, even though our handler is a no-op because |
| 103 // otherwise we cannot wait on children. (According to POSIX 2001.) | 103 // otherwise we cannot wait on children. (According to POSIX 2001.) |
| 104 struct sigaction action; | 104 struct sigaction action; |
| 105 memset(&action, 0, sizeof(action)); | 105 memset(&action, 0, sizeof(action)); |
| 106 action.sa_handler = &SIGCHLDHandler; | 106 action.sa_handler = &SIGCHLDHandler; |
| 107 CHECK(sigaction(SIGCHLD, &action, NULL) == 0); | 107 CHECK(sigaction(SIGCHLD, &action, NULL) == 0); |
| 108 | 108 |
| 109 if (UsingSUIDSandbox()) { | 109 if (UsingSUIDSandbox() || UsingNSSandbox()) { |
| 110 // Let the ZygoteHost know we are ready to go. | 110 // Let the ZygoteHost know we are ready to go. |
| 111 // The receiving code is in content/browser/zygote_host_linux.cc. | 111 // The receiving code is in content/browser/zygote_host_linux.cc. |
| 112 bool r = UnixDomainSocket::SendMsg(kZygoteSocketPairFd, | 112 bool r = UnixDomainSocket::SendMsg(kZygoteSocketPairFd, |
| 113 kZygoteHelloMessage, | 113 kZygoteHelloMessage, |
| 114 sizeof(kZygoteHelloMessage), | 114 sizeof(kZygoteHelloMessage), |
| 115 std::vector<int>()); | 115 std::vector<int>()); |
| 116 #if defined(OS_CHROMEOS) | 116 #if defined(OS_CHROMEOS) |
| 117 LOG_IF(WARNING, !r) << "Sending zygote magic failed"; | 117 LOG_IF(WARNING, !r) << "Sending zygote magic failed"; |
| 118 // Exit normally on chromeos because session manager may send SIGTERM | 118 // Exit normally on chromeos because session manager may send SIGTERM |
| 119 // right after the process starts and it may fail to send zygote magic | 119 // right after the process starts and it may fail to send zygote magic |
| (...skipping 20 matching lines...) Expand all Loading... |
| 140 return false; | 140 return false; |
| 141 } | 141 } |
| 142 *process_info = it->second; | 142 *process_info = it->second; |
| 143 return true; | 143 return true; |
| 144 } | 144 } |
| 145 | 145 |
| 146 bool Zygote::UsingSUIDSandbox() const { | 146 bool Zygote::UsingSUIDSandbox() const { |
| 147 return sandbox_flags_ & kSandboxLinuxSUID; | 147 return sandbox_flags_ & kSandboxLinuxSUID; |
| 148 } | 148 } |
| 149 | 149 |
| 150 bool Zygote::UsingNSSandbox() const { |
| 151 return sandbox_flags_ & kSandboxLinuxUserNS; |
| 152 } |
| 153 |
| 150 bool Zygote::HandleRequestFromBrowser(int fd) { | 154 bool Zygote::HandleRequestFromBrowser(int fd) { |
| 151 ScopedVector<base::ScopedFD> fds; | 155 ScopedVector<base::ScopedFD> fds; |
| 152 char buf[kZygoteMaxMessageLength]; | 156 char buf[kZygoteMaxMessageLength]; |
| 153 const ssize_t len = UnixDomainSocket::RecvMsg(fd, buf, sizeof(buf), &fds); | 157 const ssize_t len = UnixDomainSocket::RecvMsg(fd, buf, sizeof(buf), &fds); |
| 154 | 158 |
| 155 if (len == 0 || (len == -1 && errno == ECONNRESET)) { | 159 if (len == 0 || (len == -1 && errno == ECONNRESET)) { |
| 156 // EOF from the browser. We should die. | 160 // EOF from the browser. We should die. |
| 157 // TODO(earthdok): call __sanititizer_cov_dump() here to obtain code | 161 // TODO(earthdok): call __sanititizer_cov_dump() here to obtain code |
| 158 // coverage for the Zygote. Currently it's not possible because of | 162 // coverage for the Zygote. Currently it's not possible because of |
| 159 // confusion over who is responsible for closing the file descriptor. | 163 // confusion over who is responsible for closing the file descriptor. |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 PickleIterator iter) { | 585 PickleIterator iter) { |
| 582 if (HANDLE_EINTR(write(fd, &sandbox_flags_, sizeof(sandbox_flags_))) != | 586 if (HANDLE_EINTR(write(fd, &sandbox_flags_, sizeof(sandbox_flags_))) != |
| 583 sizeof(sandbox_flags_)) { | 587 sizeof(sandbox_flags_)) { |
| 584 PLOG(ERROR) << "write"; | 588 PLOG(ERROR) << "write"; |
| 585 } | 589 } |
| 586 | 590 |
| 587 return false; | 591 return false; |
| 588 } | 592 } |
| 589 | 593 |
| 590 } // namespace content | 594 } // namespace content |
| OLD | NEW |