summaryrefslogtreecommitdiffstats
path: root/chrome/nacl
diff options
context:
space:
mode:
authorbbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-21 23:07:04 +0000
committerbbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-21 23:07:04 +0000
commite46177921cafffdf8d911d92388f6d3b66483817 (patch)
tree7857dafa96f2eb9b76e1a013a875abc9d1120ac0 /chrome/nacl
parenta86c93c574d51e430b89b41a18f72924614ade6e (diff)
downloadchromium_src-e46177921cafffdf8d911d92388f6d3b66483817.zip
chromium_src-e46177921cafffdf8d911d92388f6d3b66483817.tar.gz
chromium_src-e46177921cafffdf8d911d92388f6d3b66483817.tar.bz2
Add an IPC channel between the NaCl loader process and the renderer.
BUG=116317 TEST=manual Review URL: https://chromiumcodereview.appspot.com/10214007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@143483 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/nacl')
-rw-r--r--chrome/nacl/nacl_ipc_adapter.cc7
-rw-r--r--chrome/nacl/nacl_ipc_adapter.h4
-rw-r--r--chrome/nacl/nacl_listener.cc27
3 files changed, 37 insertions, 1 deletions
diff --git a/chrome/nacl/nacl_ipc_adapter.cc b/chrome/nacl/nacl_ipc_adapter.cc
index f76fa0d..f915a6a 100644
--- a/chrome/nacl/nacl_ipc_adapter.cc
+++ b/chrome/nacl/nacl_ipc_adapter.cc
@@ -74,6 +74,7 @@ ssize_t NaClDescCustomRecvMsg(void* handle, NaClImcTypedMsgHdr* msg,
int /* flags */) {
if (msg->iov_length != 1)
return -1;
+ msg->ndesc_length = 0; // Messages with descriptors aren't supported yet.
return static_cast<ssize_t>(
ToAdapter(handle)->BlockingReceive(static_cast<char*>(msg->iov[0].base),
msg->iov[0].length));
@@ -281,6 +282,12 @@ NaClDesc* NaClIPCAdapter::MakeNaClDesc() {
return MakeNaClDescCustom(this);
}
+#if defined(OS_POSIX)
+int NaClIPCAdapter::TakeClientFileDescriptor() {
+ return io_thread_data_.channel_->TakeClientFileDescriptor();
+}
+#endif
+
bool NaClIPCAdapter::OnMessageReceived(const IPC::Message& message) {
{
base::AutoLock lock(lock_);
diff --git a/chrome/nacl/nacl_ipc_adapter.h b/chrome/nacl/nacl_ipc_adapter.h
index 12500cd..8c3c493 100644
--- a/chrome/nacl/nacl_ipc_adapter.h
+++ b/chrome/nacl/nacl_ipc_adapter.h
@@ -77,6 +77,10 @@ class NaClIPCAdapter : public base::RefCountedThreadSafe<NaClIPCAdapter>,
// NaClDesc is reference-counted, and a reference is returned.
NaClDesc* MakeNaClDesc();
+#if defined(OS_POSIX)
+ int TakeClientFileDescriptor();
+#endif
+
// Listener implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
diff --git a/chrome/nacl/nacl_listener.cc b/chrome/nacl/nacl_listener.cc
index a5433dc..7159749 100644
--- a/chrome/nacl/nacl_listener.cc
+++ b/chrome/nacl/nacl_listener.cc
@@ -13,13 +13,19 @@
#include "base/message_loop.h"
#include "base/rand_util.h"
#include "chrome/common/nacl_messages.h"
+#include "chrome/nacl/nacl_ipc_adapter.h"
#include "chrome/nacl/nacl_validation_db.h"
#include "chrome/nacl/nacl_validation_query.h"
+#include "ipc/ipc_channel_handle.h"
+#include "ipc/ipc_switches.h"
#include "ipc/ipc_sync_channel.h"
#include "ipc/ipc_sync_message_filter.h"
-#include "ipc/ipc_switches.h"
#include "native_client/src/trusted/service_runtime/sel_main_chrome.h"
+#if defined(OS_POSIX)
+#include "base/file_descriptor_posix.h"
+#endif
+
#if defined(OS_LINUX)
#include "content/public/common/child_process_sandbox_support_linux.h"
#endif
@@ -188,6 +194,25 @@ void NaClListener::OnMsgStart(const nacl::NaClStartParams& params) {
return;
}
+ if (params.enable_ipc_proxy) {
+ // Create the server side of the channel and notify the process host so it
+ // can reply to the renderer, which will connect as client.
+ IPC::ChannelHandle channel_handle =
+ IPC::Channel::GenerateVerifiedChannelID("nacl");
+
+ scoped_refptr<NaClIPCAdapter> ipc_adapter(new NaClIPCAdapter(
+ channel_handle, io_thread_.message_loop_proxy()));
+ args->initial_ipc_desc = ipc_adapter.get()->MakeNaClDesc();
+
+#if defined(OS_POSIX)
+ channel_handle.socket = base::FileDescriptor(
+ ipc_adapter.get()->TakeClientFileDescriptor(), true);
+#endif
+
+ if (!Send(new NaClProcessHostMsg_PpapiChannelCreated(channel_handle)))
+ LOG(ERROR) << "Failed to send IPC channel handle to renderer.";
+ }
+
std::vector<nacl::FileDescriptor> handles = params.handles;
#if defined(OS_LINUX) || defined(OS_MACOSX)