summaryrefslogtreecommitdiffstats
path: root/content/browser/zygote_main_linux.cc
diff options
context:
space:
mode:
authorfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-28 00:20:01 +0000
committerfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-28 00:20:01 +0000
commit3fa5cc11a02c86170fde740a2dc6bc2f7ef1d851 (patch)
treedae82d10b4485ceb6261cd3f318470b3f97c90a6 /content/browser/zygote_main_linux.cc
parent5b99724ed67011e9ef4231ec2796a5237cdf8e88 (diff)
downloadchromium_src-3fa5cc11a02c86170fde740a2dc6bc2f7ef1d851.zip
chromium_src-3fa5cc11a02c86170fde740a2dc6bc2f7ef1d851.tar.gz
chromium_src-3fa5cc11a02c86170fde740a2dc6bc2f7ef1d851.tar.bz2
Revert 90681 - New NaCl zygote implementation 2, in which Chrome zygote forks a NaCl helper.
This patch can launch earth_c.html with and without the SUID sandbox. It is enabled with the environment variable NACL_NEW_ZYGOTE. BUG=nativeclient:480 TEST=nativeclient in-browser tests on Linux, ChromeOS Review URL: http://codereview.chromium.org/6995121 TBR=bradchen@google.com Review URL: http://codereview.chromium.org/7274011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90682 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/zygote_main_linux.cc')
-rw-r--r--content/browser/zygote_main_linux.cc108
1 files changed, 35 insertions, 73 deletions
diff --git a/content/browser/zygote_main_linux.cc b/content/browser/zygote_main_linux.cc
index a3085d59..99a7735 100644
--- a/content/browser/zygote_main_linux.cc
+++ b/content/browser/zygote_main_linux.cc
@@ -37,11 +37,9 @@
#include "content/common/sandbox_methods_linux.h"
#include "content/common/set_process_title.h"
#include "content/common/unix_domain_socket_posix.h"
-#include "content/common/zygote_fork_delegate_linux.h"
#include "seccompsandbox/sandbox.h"
#include "skia/ext/SkFontHost_fontconfig_control.h"
#include "unicode/timezone.h"
-#include "ipc/ipc_switches.h"
#if defined(OS_LINUX)
#include <sys/epoll.h>
@@ -99,9 +97,8 @@ static void SELinuxTransitionToTypeOrDie(const char* type) {
// runs it.
class Zygote {
public:
- explicit Zygote(int sandbox_flags, ZygoteForkDelegate* helper)
- : sandbox_flags_(sandbox_flags),
- helper_(helper) {
+ explicit Zygote(int sandbox_flags)
+ : sandbox_flags_(sandbox_flags) {
}
bool ProcessRequests() {
@@ -168,7 +165,6 @@ class Zygote {
case ZygoteHost::kCmdFork:
// This function call can return multiple times, once per fork().
return HandleForkRequest(fd, pickle, iter, fds);
-
case ZygoteHost::kCmdReap:
if (!fds.empty())
break;
@@ -251,12 +247,9 @@ class Zygote {
// sandbox, it returns the real PID of the child process as it
// appears outside the sandbox, rather than returning the PID inside
// the sandbox.
- int ForkWithRealPid(const std::string& process_type, std::vector<int>& fds,
- const std::string& channel_switch) {
- const bool use_helper = (helper_ && helper_->CanHelp(process_type));
- if (!(use_helper || g_suid_sandbox_active)) {
+ int ForkWithRealPid() {
+ if (!g_suid_sandbox_active)
return fork();
- }
int dummy_fd;
ino_t dummy_inode;
@@ -277,13 +270,7 @@ class Zygote {
goto error;
}
- if (use_helper) {
- fds.push_back(dummy_fd);
- fds.push_back(pipe_fds[0]);
- pid = helper_->Fork(fds);
- } else {
- pid = fork();
- }
+ pid = fork();
if (pid < 0) {
goto error;
} else if (pid == 0) {
@@ -307,43 +294,33 @@ class Zygote {
dummy_fd = -1;
close(pipe_fds[0]);
pipe_fds[0] = -1;
- base::ProcessId real_pid;
- if (g_suid_sandbox_active) {
- uint8_t reply_buf[512];
- Pickle request;
- request.WriteInt(LinuxSandbox::METHOD_GET_CHILD_WITH_INODE);
- request.WriteUInt64(dummy_inode);
-
- const ssize_t r = UnixDomainSocket::SendRecvMsg(
- kMagicSandboxIPCDescriptor, reply_buf, sizeof(reply_buf), NULL,
- request);
- if (r == -1) {
- LOG(ERROR) << "Failed to get child process's real PID";
- goto error;
- }
+ uint8_t reply_buf[512];
+ Pickle request;
+ request.WriteInt(LinuxSandbox::METHOD_GET_CHILD_WITH_INODE);
+ request.WriteUInt64(dummy_inode);
+
+ const ssize_t r = UnixDomainSocket::SendRecvMsg(
+ kMagicSandboxIPCDescriptor, reply_buf, sizeof(reply_buf), NULL,
+ request);
+ if (r == -1) {
+ LOG(ERROR) << "Failed to get child process's real PID";
+ goto error;
+ }
- Pickle reply(reinterpret_cast<char*>(reply_buf), r);
- void* iter = NULL;
- if (!reply.ReadInt(&iter, &real_pid))
- goto error;
- if (real_pid <= 0) {
- // METHOD_GET_CHILD_WITH_INODE failed. Did the child die already?
- LOG(ERROR) << "METHOD_GET_CHILD_WITH_INODE failed";
- goto error;
- }
- real_pids_to_sandbox_pids[real_pid] = pid;
+ base::ProcessId real_pid;
+ Pickle reply(reinterpret_cast<char*>(reply_buf), r);
+ void* iter2 = NULL;
+ if (!reply.ReadInt(&iter2, &real_pid))
+ goto error;
+ if (real_pid <= 0) {
+ // METHOD_GET_CHILD_WITH_INODE failed. Did the child die already?
+ LOG(ERROR) << "METHOD_GET_CHILD_WITH_INODE failed";
+ goto error;
}
- if (use_helper) {
- real_pid = pid;
- if (!helper_->AckChild(pipe_fds[1], channel_switch)) {
- LOG(ERROR) << "Failed to synchronise with NaCl child process";
- goto error;
- }
- } else {
- if (HANDLE_EINTR(write(pipe_fds[1], "x", 1)) != 1) {
- LOG(ERROR) << "Failed to synchronise with child process";
- goto error;
- }
+ real_pids_to_sandbox_pids[real_pid] = pid;
+ if (HANDLE_EINTR(write(pipe_fds[1], "x", 1)) != 1) {
+ LOG(ERROR) << "Failed to synchronise with child process";
+ goto error;
}
close(pipe_fds[1]);
return real_pid;
@@ -365,19 +342,12 @@ class Zygote {
// Handle a 'fork' request from the browser: this means that the browser
// wishes to start a new renderer.
- bool HandleForkRequest(int fd, const Pickle& pickle,
- void* iter, std::vector<int>& fds) {
+ bool HandleForkRequest(int fd, const Pickle& pickle, void* iter,
+ std::vector<int>& fds) {
std::vector<std::string> args;
int argc, numfds;
base::GlobalDescriptors::Mapping mapping;
base::ProcessId child;
- std::string process_type;
- std::string channel_id;
- const std::string channel_id_prefix = std::string("--")
- + switches::kProcessChannelID + std::string("=");
-
- if (!pickle.ReadString(&iter, &process_type))
- goto error;
if (!pickle.ReadInt(&iter, &argc))
goto error;
@@ -387,8 +357,6 @@ class Zygote {
if (!pickle.ReadString(&iter, &arg))
goto error;
args.push_back(arg);
- if (arg.compare(0, channel_id_prefix.length(), channel_id_prefix) == 0)
- channel_id = arg;
}
if (!pickle.ReadInt(&iter, &numfds))
@@ -406,7 +374,7 @@ class Zygote {
mapping.push_back(std::make_pair(
static_cast<uint32_t>(kSandboxIPCChannel), kMagicSandboxIPCDescriptor));
- child = ForkWithRealPid(process_type, fds, channel_id);
+ child = ForkWithRealPid();
if (!child) {
#if defined(SECCOMP_SANDBOX)
@@ -479,7 +447,6 @@ class Zygote {
ProcessMap real_pids_to_sandbox_pids;
const int sandbox_flags_;
- ZygoteForkDelegate* helper_;
};
// With SELinux we can carve out a precise sandbox, so we don't have to play
@@ -738,8 +705,7 @@ static bool EnterSandbox() {
#endif // CHROMIUM_SELINUX
-bool ZygoteMain(const MainFunctionParams& params,
- ZygoteForkDelegate* forkdelegate) {
+bool ZygoteMain(const MainFunctionParams& params) {
#if !defined(CHROMIUM_SELINUX)
g_am_zygote_or_renderer = true;
#endif
@@ -758,10 +724,6 @@ bool ZygoteMain(const MainFunctionParams& params,
}
#endif // SECCOMP_SANDBOX
- VLOG(1) << "initializing fork delegate";
- forkdelegate->Init(getenv("SBX_D") != NULL, // g_suid_sandbox_active,
- kBrowserDescriptor, kMagicSandboxIPCDescriptor);
-
// Turn on the SELinux or SUID sandbox
if (!EnterSandbox()) {
LOG(FATAL) << "Failed to enter sandbox. Fail safe abort. (errno: "
@@ -798,7 +760,7 @@ bool ZygoteMain(const MainFunctionParams& params,
}
#endif // SECCOMP_SANDBOX
- Zygote zygote(sandbox_flags, forkdelegate);
+ Zygote zygote(sandbox_flags);
// This function call can return multiple times, once per fork().
return zygote.ProcessRequests();
}