summaryrefslogtreecommitdiffstats
path: root/chrome/browser/zygote_host_linux.cc
diff options
context:
space:
mode:
authorkkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-07 17:22:40 +0000
committerkkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-07 17:22:40 +0000
commitb74538cf2eb1e4052422ba1c12ab3de21b5e3aeb (patch)
treee6bd0e67a02f1b7c444ed7f3519ab84615599507 /chrome/browser/zygote_host_linux.cc
parent716726ed94affaff96391b9c80a9662dd915a6bb (diff)
downloadchromium_src-b74538cf2eb1e4052422ba1c12ab3de21b5e3aeb.zip
chromium_src-b74538cf2eb1e4052422ba1c12ab3de21b5e3aeb.tar.gz
chromium_src-b74538cf2eb1e4052422ba1c12ab3de21b5e3aeb.tar.bz2
[Linux] Fix race in ZygoteHost where socket read and writes were getting interleaved.
BUG=31737 TEST=none Review URL: http://codereview.chromium.org/1921006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46702 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/zygote_host_linux.cc')
-rw-r--r--chrome/browser/zygote_host_linux.cc25
1 files changed, 16 insertions, 9 deletions
diff --git a/chrome/browser/zygote_host_linux.cc b/chrome/browser/zygote_host_linux.cc
index 9885234..051fc3d 100644
--- a/chrome/browser/zygote_host_linux.cc
+++ b/chrome/browser/zygote_host_linux.cc
@@ -211,12 +211,15 @@ pid_t ZygoteHost::ForkRenderer(
fds.push_back(i->second);
}
- if (!base::SendMsg(control_fd_, pickle.data(), pickle.size(), fds))
- return base::kNullProcessHandle;
-
pid_t pid;
- if (HANDLE_EINTR(read(control_fd_, &pid, sizeof(pid))) != sizeof(pid))
- return base::kNullProcessHandle;
+ {
+ AutoLock lock(control_lock_);
+ if (!base::SendMsg(control_fd_, pickle.data(), pickle.size(), fds))
+ return base::kNullProcessHandle;
+
+ if (HANDLE_EINTR(read(control_fd_, &pid, sizeof(pid))) != sizeof(pid))
+ return base::kNullProcessHandle;
+ }
const int kRendererScore = 5;
if (using_suid_sandbox_) {
@@ -258,12 +261,16 @@ bool ZygoteHost::DidProcessCrash(base::ProcessHandle handle,
pickle.WriteInt(kCmdDidProcessCrash);
pickle.WriteInt(handle);
- if (HANDLE_EINTR(write(control_fd_, pickle.data(), pickle.size())) < 0)
- PLOG(ERROR) << "write";
-
static const unsigned kMaxMessageLength = 128;
char buf[kMaxMessageLength];
- const ssize_t len = HANDLE_EINTR(read(control_fd_, buf, sizeof(buf)));
+ ssize_t len;
+ {
+ AutoLock lock(control_lock_);
+ if (HANDLE_EINTR(write(control_fd_, pickle.data(), pickle.size())) < 0)
+ PLOG(ERROR) << "write";
+
+ len = HANDLE_EINTR(read(control_fd_, buf, sizeof(buf)));
+ }
if (len == -1) {
LOG(WARNING) << "Error reading message from zygote: " << errno;