Chromium Code Reviews| Index: components/nacl/loader/nacl_listener.cc |
| diff --git a/components/nacl/loader/nacl_listener.cc b/components/nacl/loader/nacl_listener.cc |
| index c0e3c5e717054788ea2170d79f466b3fe8da1681..cf941cac32a3ca0b735cf2593ada0f5d1b0329fa 100644 |
| --- a/components/nacl/loader/nacl_listener.cc |
| +++ b/components/nacl/loader/nacl_listener.cc |
| @@ -131,15 +131,29 @@ void DebugStubPortSelectedHandler(uint16_t port) { |
| #endif |
| +// This function should be used be provided to the ManifestChannel |
|
Mark Seaborn
2014/09/09 04:42:30
Remove "be used"?
teravest
2014/09/09 16:49:07
I've removed this function. You're correct that Na
|
| +// NaClIPCAdapter instead of the one inside NaClListener; this one will always |
|
Mark Seaborn
2014/09/09 04:42:30
You mean instead of the one in BrowserValidationDB
teravest
2014/09/09 16:49:07
Acknowledged.
|
| +// run the callback, even if the NaClListener has been destroyed. |
|
Mark Seaborn
2014/09/09 04:42:30
I'm pretty sure NaClListener never gets destroyed.
teravest
2014/09/09 16:49:07
Acknowledged.
|
| +void ResolveFileToken( |
| + uint64_t token_lo, |
| + uint64_t token_hi, |
| + base::Callback<void(IPC::PlatformFileForTransit, |
| + base::FilePath)> resolved_cb) { |
| + if (!g_listener) |
| + resolved_cb.Run(IPC::PlatformFileForTransit(), base::FilePath()); |
| + g_listener->ResolveFileToken(token_lo, token_hi, resolved_cb); |
| +} |
| + |
| // 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> 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(); |
| @@ -151,6 +165,7 @@ void SetUpIPCAdapter(IPC::ChannelHandle* handle, |
| // Pass a NaClDesc to the untrusted side. This will hold a ref to the |
| // NaClIPCAdapter. |
| NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); |
| + return ipc_adapter; |
| } |
| } // namespace |
| @@ -251,6 +266,30 @@ bool NaClListener::Send(IPC::Message* msg) { |
| } |
| } |
| +class FileTokenMessageFilter : public IPC::MessageFilter { |
| + public: |
| + virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(FileTokenMessageFilter, msg) |
| + IPC_MESSAGE_HANDLER(NaClProcessMsg_ResolveFileTokenAsyncReply, |
| + OnResolveFileTokenAsyncReply) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| + } |
| + |
| + void OnResolveFileTokenAsyncReply( |
| + uint64_t token_lo, |
| + uint64_t token_hi, |
| + IPC::PlatformFileForTransit ipc_fd, |
| + base::FilePath file_path) { |
| + if (g_listener) |
|
Mark Seaborn
2014/09/09 04:42:30
Make this a CHECK() too?
teravest
2014/09/09 16:49:07
Done.
|
| + g_listener->OnFileTokenResolved(token_lo, token_hi, ipc_fd, file_path); |
| + } |
| + private: |
| + virtual ~FileTokenMessageFilter() { } |
| +}; |
| + |
| void NaClListener::Listen() { |
| std::string channel_name = |
| CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| @@ -259,6 +298,7 @@ void NaClListener::Listen() { |
| this, io_thread_.message_loop_proxy().get(), &shutdown_event_); |
| filter_ = new IPC::SyncMessageFilter(&shutdown_event_); |
| channel_->AddFilter(filter_.get()); |
| + channel_->AddFilter(new FileTokenMessageFilter()); |
| channel_->Init(channel_name, IPC::Channel::MODE_CLIENT, true); |
| main_loop_ = base::MessageLoop::current(); |
| main_loop_->Run(); |
| @@ -298,10 +338,12 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| IPC::ChannelHandle browser_handle; |
| IPC::ChannelHandle ppapi_renderer_handle; |
| + IPC::ChannelHandle manifest_service_handle; |
| if (params.enable_ipc_proxy) { |
| browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| + manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| // Create the PPAPI IPC channels between the NaCl IRT and the host |
| // (browser/renderer) processes. The IRT uses these channels to |
| @@ -310,6 +352,14 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| nap, NACL_CHROME_DESC_BASE); |
| SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), |
| nap, NACL_CHROME_DESC_BASE + 1); |
| + |
| + scoped_refptr<NaClIPCAdapter> manifest_ipc_adapter = |
| + SetUpIPCAdapter(&manifest_service_handle, |
| + io_thread_.message_loop_proxy(), |
| + nap, |
| + NACL_CHROME_DESC_BASE + 2); |
| + manifest_ipc_adapter->set_resolve_file_token_callback( |
| + base::Bind(&::ResolveFileToken)); |
| } |
| trusted_listener_ = new NaClTrustedListener( |
| @@ -320,7 +370,7 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| browser_handle, |
| ppapi_renderer_handle, |
| trusted_listener_->TakeClientChannelHandle(), |
| - IPC::ChannelHandle()))) |
| + manifest_service_handle))) |
| LOG(ERROR) << "Failed to send IPC channel handle to NaClProcessHost."; |
| std::vector<nacl::FileDescriptor> handles = params.handles; |
| @@ -427,3 +477,23 @@ void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| trusted_listener_->Send(new NaClRendererMsg_ReportExitStatus(exit_status)); |
| NaClExit(exit_status); |
| } |
| + |
| +void NaClListener::ResolveFileToken( |
| + uint64_t token_lo, |
| + uint64_t token_hi, |
| + base::Callback<void(IPC::PlatformFileForTransit, base::FilePath)> cb) { |
| + if (!Send(new NaClProcessMsg_ResolveFileTokenAsync(token_lo, token_hi))) { |
| + cb.Run(IPC::PlatformFileForTransit(), base::FilePath()); |
| + return; |
| + } |
| + resolved_cb_ = cb; |
| +} |
| + |
| +void NaClListener::OnFileTokenResolved( |
| + uint64_t token_lo, |
| + uint64_t token_hi, |
| + IPC::PlatformFileForTransit ipc_fd, |
| + base::FilePath file_path) { |
| + resolved_cb_.Run(ipc_fd, file_path); |
| + resolved_cb_.Reset(); |
| +} |