Index: components/nacl/loader/nacl_listener.cc |
diff --git a/components/nacl/loader/nacl_listener.cc b/components/nacl/loader/nacl_listener.cc |
index 3afbff97e0ff6ff4385b93d679dcf67b7944628c..c35d946d5bbb369ac221ee5e96a359dfb93e94ff 100644 |
--- a/components/nacl/loader/nacl_listener.cc |
+++ b/components/nacl/loader/nacl_listener.cc |
@@ -109,6 +109,28 @@ int AttachDebugExceptionHandler(const void* info, size_t info_size) { |
#endif |
+// Creates the PPAPI IPC channel between the NaCl IRT and the host |
+// (browser/renderer) process, and starts to listen it on the thread where |
+// the given message_loop_proxy runs. |
+// Also, creates and sets the corresponding NaClDesc to the given nap with |
+// the FD #. |
+void SetUpIPCAdapter(IPC::ChannelHandle* handle, |
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy, |
+ struct NaClApp* nap, |
+ int nacl_fd) { |
+ scoped_refptr<NaClIPCAdapter> ipc_adapter( |
+ new NaClIPCAdapter(*handle, message_loop_proxy.get())); |
+ ipc_adapter->ConnectChannel(); |
+#if defined(OS_POSIX) |
+ handle->socket = |
+ base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor(), true); |
+#endif |
+ |
+ // Pass a NaClDesc to the untrusted side. This will hold a ref to the |
+ // NaClIPCAdapter. |
+ NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); |
+} |
+ |
} // namespace |
class BrowserValidationDBProxy : public NaClValidationDB { |
@@ -249,6 +271,7 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
LOG(ERROR) << "NaClChromeMainArgsCreate() failed"; |
return; |
} |
+ |
struct NaClApp *nap = NaClAppCreate(); |
if (nap == NULL) { |
LOG(ERROR) << "NaClAppCreate() failed"; |
@@ -256,23 +279,21 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
} |
if (params.enable_ipc_proxy) { |
- // Create the initial PPAPI IPC channel between the NaCl IRT and the |
- // browser process. The IRT uses this channel to communicate with the |
- // browser and to create additional IPC channels to renderer processes. |
- IPC::ChannelHandle handle = |
+ // Create the PPAPI IPC channels between the NaCl IRT and the hosts |
+ // (browser/renderer) processes. The IRT uses these channels to communicate |
+ // with the host and to initialize the IPC dispatchers. |
+ IPC::ChannelHandle browser_handle = |
IPC::Channel::GenerateVerifiedChannelID("nacl"); |
- scoped_refptr<NaClIPCAdapter> ipc_adapter( |
- new NaClIPCAdapter(handle, io_thread_.message_loop_proxy().get())); |
- ipc_adapter->ConnectChannel(); |
+ SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), |
+ nap, NACL_CHROME_DESC_BASE); |
- // Pass a NaClDesc to the untrusted side. This will hold a ref to the |
- // NaClIPCAdapter. |
- NaClAppSetDesc(nap, NACL_CHROME_DESC_BASE, ipc_adapter->MakeNaClDesc()); |
-#if defined(OS_POSIX) |
- handle.socket = base::FileDescriptor( |
- ipc_adapter->TakeClientFileDescriptor(), true); |
-#endif |
- if (!Send(new NaClProcessHostMsg_PpapiChannelCreated(handle))) |
+ IPC::ChannelHandle renderer_handle = |
+ IPC::Channel::GenerateVerifiedChannelID("nacl"); |
+ SetUpIPCAdapter(&renderer_handle, io_thread_.message_loop_proxy(), |
+ nap, NACL_CHROME_DESC_BASE + 1); |
+ |
+ if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( |
+ browser_handle, renderer_handle))) |
LOG(ERROR) << "Failed to send IPC channel handle to NaClProcessHost."; |
} |