| Index: chrome/browser/nacl_host/nacl_process_host.cc
|
| diff --git a/chrome/browser/nacl_host/nacl_process_host.cc b/chrome/browser/nacl_host/nacl_process_host.cc
|
| index 7d628a77f132a8915950097ebd68f4848a826452..1c7d5f388dacf383ffbbc057bebd987a1fce9dcc 100644
|
| --- a/chrome/browser/nacl_host/nacl_process_host.cc
|
| +++ b/chrome/browser/nacl_host/nacl_process_host.cc
|
| @@ -127,8 +127,12 @@ ppapi::PpapiPermissions GetNaClPermissions(uint32 permission_bits) {
|
| } // namespace
|
|
|
| struct NaClProcessHost::NaClInternal {
|
| - std::vector<nacl::Handle> sockets_for_renderer;
|
| - std::vector<nacl::Handle> sockets_for_sel_ldr;
|
| + nacl::Handle socket_for_renderer;
|
| + nacl::Handle socket_for_sel_ldr;
|
| +
|
| + NaClInternal()
|
| + : socket_for_renderer(nacl::kInvalidHandle),
|
| + socket_for_sel_ldr(nacl::kInvalidHandle) { }
|
| };
|
|
|
| // -----------------------------------------------------------------------------
|
| @@ -204,13 +208,14 @@ NaClProcessHost::~NaClProcessHost() {
|
| LOG(ERROR) << message;
|
| }
|
|
|
| - for (size_t i = 0; i < internal_->sockets_for_renderer.size(); i++) {
|
| - if (nacl::Close(internal_->sockets_for_renderer[i]) != 0) {
|
| + if (internal_->socket_for_renderer != nacl::kInvalidHandle) {
|
| + if (nacl::Close(internal_->socket_for_renderer) != 0) {
|
| NOTREACHED() << "nacl::Close() failed";
|
| }
|
| }
|
| - for (size_t i = 0; i < internal_->sockets_for_sel_ldr.size(); i++) {
|
| - if (nacl::Close(internal_->sockets_for_sel_ldr[i]) != 0) {
|
| +
|
| + if (internal_->socket_for_sel_ldr != nacl::kInvalidHandle) {
|
| + if (nacl::Close(internal_->socket_for_sel_ldr) != 0) {
|
| NOTREACHED() << "nacl::Close() failed";
|
| }
|
| }
|
| @@ -252,21 +257,12 @@ void NaClProcessHost::EarlyStartup() {
|
|
|
| void NaClProcessHost::Launch(
|
| ChromeRenderMessageFilter* chrome_render_message_filter,
|
| - int socket_count,
|
| IPC::Message* reply_msg,
|
| scoped_refptr<ExtensionInfoMap> extension_info_map) {
|
| chrome_render_message_filter_ = chrome_render_message_filter;
|
| reply_msg_ = reply_msg;
|
| extension_info_map_ = extension_info_map;
|
|
|
| - // Place an arbitrary limit on the number of sockets to limit
|
| - // exposure in case the renderer is compromised. We can increase
|
| - // this if necessary.
|
| - if (socket_count > 8) {
|
| - delete this;
|
| - return;
|
| - }
|
| -
|
| // Start getting the IRT open asynchronously while we launch the NaCl process.
|
| // We'll make sure this actually finished in StartWithLaunchedProcess, below.
|
| NaClBrowser* nacl_browser = NaClBrowser::GetInstance();
|
| @@ -286,18 +282,16 @@ void NaClProcessHost::Launch(
|
| // This means the sandboxed renderer cannot send handles to the
|
| // browser process.
|
|
|
| - for (int i = 0; i < socket_count; i++) {
|
| - nacl::Handle pair[2];
|
| - // Create a connected socket
|
| - if (nacl::SocketPair(pair) == -1) {
|
| - delete this;
|
| - return;
|
| - }
|
| - internal_->sockets_for_renderer.push_back(pair[0]);
|
| - internal_->sockets_for_sel_ldr.push_back(pair[1]);
|
| - SetCloseOnExec(pair[0]);
|
| - SetCloseOnExec(pair[1]);
|
| + nacl::Handle pair[2];
|
| + // Create a connected socket
|
| + if (nacl::SocketPair(pair) == -1) {
|
| + delete this;
|
| + return;
|
| }
|
| + internal_->socket_for_renderer = pair[0];
|
| + internal_->socket_for_sel_ldr = pair[1];
|
| + SetCloseOnExec(pair[0]);
|
| + SetCloseOnExec(pair[1]);
|
|
|
| // Launch the process
|
| if (!LaunchSelLdr()) {
|
| @@ -618,33 +612,31 @@ void NaClProcessHost::OnResourcesReady() {
|
|
|
| bool NaClProcessHost::ReplyToRenderer(
|
| const IPC::ChannelHandle& channel_handle) {
|
| - std::vector<nacl::FileDescriptor> handles_for_renderer;
|
| - for (size_t i = 0; i < internal_->sockets_for_renderer.size(); i++) {
|
| + nacl::FileDescriptor handle_for_renderer;
|
| #if defined(OS_WIN)
|
| - // Copy the handle into the renderer process.
|
| - HANDLE handle_in_renderer;
|
| - if (!DuplicateHandle(base::GetCurrentProcessHandle(),
|
| - reinterpret_cast<HANDLE>(
|
| - internal_->sockets_for_renderer[i]),
|
| - chrome_render_message_filter_->peer_handle(),
|
| - &handle_in_renderer,
|
| - 0, // Unused given DUPLICATE_SAME_ACCESS.
|
| - FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - DLOG(ERROR) << "DuplicateHandle() failed";
|
| - return false;
|
| - }
|
| - handles_for_renderer.push_back(
|
| - reinterpret_cast<nacl::FileDescriptor>(handle_in_renderer));
|
| + // Copy the handle into the renderer process.
|
| + HANDLE handle_in_renderer;
|
| + if (!DuplicateHandle(base::GetCurrentProcessHandle(),
|
| + reinterpret_cast<HANDLE>(
|
| + internal_->socket_for_renderer),
|
| + chrome_render_message_filter_->peer_handle(),
|
| + &handle_in_renderer,
|
| + 0, // Unused given DUPLICATE_SAME_ACCESS.
|
| + FALSE,
|
| + DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| + DLOG(ERROR) << "DuplicateHandle() failed";
|
| + return false;
|
| + }
|
| + handle_for_renderer = reinterpret_cast<nacl::FileDescriptor>(
|
| + handle_in_renderer);
|
| #else
|
| - // No need to dup the imc_handle - we don't pass it anywhere else so
|
| - // it cannot be closed.
|
| - nacl::FileDescriptor imc_handle;
|
| - imc_handle.fd = internal_->sockets_for_renderer[i];
|
| - imc_handle.auto_close = true;
|
| - handles_for_renderer.push_back(imc_handle);
|
| + // No need to dup the imc_handle - we don't pass it anywhere else so
|
| + // it cannot be closed.
|
| + nacl::FileDescriptor imc_handle;
|
| + imc_handle.fd = internal_->socket_for_renderer;
|
| + imc_handle.auto_close = true;
|
| + handle_for_renderer = imc_handle;
|
| #endif
|
| - }
|
|
|
| #if defined(OS_WIN)
|
| // If we are on 64-bit Windows, the NaCl process's sandbox is
|
| @@ -662,12 +654,12 @@ bool NaClProcessHost::ReplyToRenderer(
|
|
|
| const ChildProcessData& data = process_->GetData();
|
| ChromeViewHostMsg_LaunchNaCl::WriteReplyParams(
|
| - reply_msg_, handles_for_renderer,
|
| + reply_msg_, handle_for_renderer,
|
| channel_handle, base::GetProcId(data.handle), data.id);
|
| chrome_render_message_filter_->Send(reply_msg_);
|
| chrome_render_message_filter_ = NULL;
|
| reply_msg_ = NULL;
|
| - internal_->sockets_for_renderer.clear();
|
| + internal_->socket_for_renderer = nacl::kInvalidHandle;
|
| return true;
|
| }
|
|
|
| @@ -719,12 +711,10 @@ bool NaClProcessHost::StartNaClExecution() {
|
| CHECK_NE(irt_file, base::kInvalidPlatformFileValue);
|
|
|
| const ChildProcessData& data = process_->GetData();
|
| - for (size_t i = 0; i < internal_->sockets_for_sel_ldr.size(); i++) {
|
| - if (!ShareHandleToSelLdr(data.handle,
|
| - internal_->sockets_for_sel_ldr[i], true,
|
| - ¶ms.handles)) {
|
| - return false;
|
| - }
|
| + if (!ShareHandleToSelLdr(data.handle,
|
| + internal_->socket_for_sel_ldr, true,
|
| + ¶ms.handles)) {
|
| + return false;
|
| }
|
|
|
| // Send over the IRT file handle. We don't close our own copy!
|
| @@ -766,7 +756,7 @@ bool NaClProcessHost::StartNaClExecution() {
|
|
|
| process_->Send(new NaClProcessMsg_Start(params));
|
|
|
| - internal_->sockets_for_sel_ldr.clear();
|
| + internal_->socket_for_sel_ldr = nacl::kInvalidHandle;
|
| return true;
|
| }
|
|
|
|
|