| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/nacl/loader/nacl_listener.h" | 5 #include "components/nacl/loader/nacl_listener.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| 11 | 11 |
| 12 #if defined(OS_POSIX) | 12 #if defined(OS_POSIX) |
| 13 #include <unistd.h> | 13 #include <unistd.h> |
| 14 #endif | 14 #endif |
| 15 | 15 |
| 16 #include "base/command_line.h" | 16 #include "base/command_line.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
| 19 #include "base/message_loop/message_loop.h" | |
| 20 #include "base/rand_util.h" | 19 #include "base/rand_util.h" |
| 20 #include "base/single_thread_task_runner.h" |
| 21 #include "components/nacl/common/nacl_messages.h" | 21 #include "components/nacl/common/nacl_messages.h" |
| 22 #include "components/nacl/common/nacl_renderer_messages.h" | 22 #include "components/nacl/common/nacl_renderer_messages.h" |
| 23 #include "components/nacl/common/nacl_switches.h" | 23 #include "components/nacl/common/nacl_switches.h" |
| 24 #include "components/nacl/loader/nacl_ipc_adapter.h" | 24 #include "components/nacl/loader/nacl_ipc_adapter.h" |
| 25 #include "components/nacl/loader/nacl_validation_db.h" | 25 #include "components/nacl/loader/nacl_validation_db.h" |
| 26 #include "components/nacl/loader/nacl_validation_query.h" | 26 #include "components/nacl/loader/nacl_validation_query.h" |
| 27 #include "ipc/ipc_channel_handle.h" | 27 #include "ipc/ipc_channel_handle.h" |
| 28 #include "ipc/ipc_switches.h" | 28 #include "ipc/ipc_switches.h" |
| 29 #include "ipc/ipc_sync_channel.h" | 29 #include "ipc/ipc_sync_channel.h" |
| 30 #include "ipc/ipc_sync_message_filter.h" | 30 #include "ipc/ipc_sync_message_filter.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 | 136 |
| 137 #endif | 137 #endif |
| 138 | 138 |
| 139 // Creates the PPAPI IPC channel between the NaCl IRT and the host | 139 // Creates the PPAPI IPC channel between the NaCl IRT and the host |
| 140 // (browser/renderer) process, and starts to listen it on the thread where | 140 // (browser/renderer) process, and starts to listen it on the thread where |
| 141 // the given message_loop_proxy runs. | 141 // the given message_loop_proxy runs. |
| 142 // Also, creates and sets the corresponding NaClDesc to the given nap with | 142 // Also, creates and sets the corresponding NaClDesc to the given nap with |
| 143 // the FD #. | 143 // the FD #. |
| 144 void SetUpIPCAdapter( | 144 void SetUpIPCAdapter( |
| 145 IPC::ChannelHandle* handle, | 145 IPC::ChannelHandle* handle, |
| 146 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 146 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 147 struct NaClApp* nap, | 147 struct NaClApp* nap, |
| 148 int nacl_fd, | 148 int nacl_fd, |
| 149 NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, | 149 NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, |
| 150 NaClIPCAdapter::OpenResourceCallback open_resource_cb) { | 150 NaClIPCAdapter::OpenResourceCallback open_resource_cb) { |
| 151 scoped_refptr<NaClIPCAdapter> ipc_adapter( | 151 scoped_refptr<NaClIPCAdapter> ipc_adapter(new NaClIPCAdapter( |
| 152 new NaClIPCAdapter(*handle, | 152 *handle, task_runner.get(), resolve_file_token_cb, open_resource_cb)); |
| 153 message_loop_proxy.get(), | |
| 154 resolve_file_token_cb, | |
| 155 open_resource_cb)); | |
| 156 ipc_adapter->ConnectChannel(); | 153 ipc_adapter->ConnectChannel(); |
| 157 #if defined(OS_POSIX) | 154 #if defined(OS_POSIX) |
| 158 handle->socket = | 155 handle->socket = |
| 159 base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor()); | 156 base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor()); |
| 160 #endif | 157 #endif |
| 161 | 158 |
| 162 // Pass a NaClDesc to the untrusted side. This will hold a ref to the | 159 // Pass a NaClDesc to the untrusted side. This will hold a ref to the |
| 163 // NaClIPCAdapter. | 160 // NaClIPCAdapter. |
| 164 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); | 161 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); |
| 165 } | 162 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 g_listener->OnFileTokenResolved(token_lo, token_hi, ipc_fd, file_path); | 253 g_listener->OnFileTokenResolved(token_lo, token_hi, ipc_fd, file_path); |
| 257 } | 254 } |
| 258 private: | 255 private: |
| 259 ~FileTokenMessageFilter() override {} | 256 ~FileTokenMessageFilter() override {} |
| 260 }; | 257 }; |
| 261 | 258 |
| 262 void NaClListener::Listen() { | 259 void NaClListener::Listen() { |
| 263 std::string channel_name = | 260 std::string channel_name = |
| 264 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 261 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 265 switches::kProcessChannelID); | 262 switches::kProcessChannelID); |
| 266 channel_ = IPC::SyncChannel::Create( | 263 channel_ = IPC::SyncChannel::Create(this, io_thread_.task_runner().get(), |
| 267 this, io_thread_.message_loop_proxy().get(), &shutdown_event_); | 264 &shutdown_event_); |
| 268 filter_ = new IPC::SyncMessageFilter(&shutdown_event_); | 265 filter_ = new IPC::SyncMessageFilter(&shutdown_event_); |
| 269 channel_->AddFilter(filter_.get()); | 266 channel_->AddFilter(filter_.get()); |
| 270 channel_->AddFilter(new FileTokenMessageFilter()); | 267 channel_->AddFilter(new FileTokenMessageFilter()); |
| 271 channel_->Init(channel_name, IPC::Channel::MODE_CLIENT, true); | 268 channel_->Init(channel_name, IPC::Channel::MODE_CLIENT, true); |
| 272 main_loop_ = base::MessageLoop::current(); | 269 main_loop_ = base::MessageLoop::current(); |
| 273 main_loop_->Run(); | 270 main_loop_->Run(); |
| 274 } | 271 } |
| 275 | 272 |
| 276 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { | 273 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { |
| 277 bool handled = true; | 274 bool handled = true; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 IPC::ChannelHandle manifest_service_handle; | 353 IPC::ChannelHandle manifest_service_handle; |
| 357 | 354 |
| 358 if (params.enable_ipc_proxy) { | 355 if (params.enable_ipc_proxy) { |
| 359 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 356 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 360 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 357 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 361 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 358 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 362 | 359 |
| 363 // Create the PPAPI IPC channels between the NaCl IRT and the host | 360 // Create the PPAPI IPC channels between the NaCl IRT and the host |
| 364 // (browser/renderer) processes. The IRT uses these channels to | 361 // (browser/renderer) processes. The IRT uses these channels to |
| 365 // communicate with the host and to initialize the IPC dispatchers. | 362 // communicate with the host and to initialize the IPC dispatchers. |
| 366 SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), | 363 SetUpIPCAdapter(&browser_handle, io_thread_.task_runner(), nap, |
| 367 nap, NACL_CHROME_DESC_BASE, | 364 NACL_CHROME_DESC_BASE, |
| 368 NaClIPCAdapter::ResolveFileTokenCallback(), | 365 NaClIPCAdapter::ResolveFileTokenCallback(), |
| 369 NaClIPCAdapter::OpenResourceCallback()); | 366 NaClIPCAdapter::OpenResourceCallback()); |
| 370 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), | 367 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.task_runner(), nap, |
| 371 nap, NACL_CHROME_DESC_BASE + 1, | 368 NACL_CHROME_DESC_BASE + 1, |
| 372 NaClIPCAdapter::ResolveFileTokenCallback(), | 369 NaClIPCAdapter::ResolveFileTokenCallback(), |
| 373 NaClIPCAdapter::OpenResourceCallback()); | 370 NaClIPCAdapter::OpenResourceCallback()); |
| 374 SetUpIPCAdapter(&manifest_service_handle, | 371 SetUpIPCAdapter( |
| 375 io_thread_.message_loop_proxy(), | 372 &manifest_service_handle, io_thread_.task_runner(), nap, |
| 376 nap, | 373 NACL_CHROME_DESC_BASE + 2, |
| 377 NACL_CHROME_DESC_BASE + 2, | 374 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)), |
| 378 base::Bind(&NaClListener::ResolveFileToken, | 375 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this))); |
| 379 base::Unretained(this)), | |
| 380 base::Bind(&NaClListener::OnOpenResource, | |
| 381 base::Unretained(this))); | |
| 382 } | 376 } |
| 383 | 377 |
| 384 trusted_listener_ = new NaClTrustedListener( | 378 trusted_listener_ = |
| 385 IPC::Channel::GenerateVerifiedChannelID("nacl"), | 379 new NaClTrustedListener(IPC::Channel::GenerateVerifiedChannelID("nacl"), |
| 386 io_thread_.message_loop_proxy().get(), | 380 io_thread_.task_runner().get(), &shutdown_event_); |
| 387 &shutdown_event_); | |
| 388 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( | 381 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( |
| 389 browser_handle, | 382 browser_handle, |
| 390 ppapi_renderer_handle, | 383 ppapi_renderer_handle, |
| 391 trusted_listener_->TakeClientChannelHandle(), | 384 trusted_listener_->TakeClientChannelHandle(), |
| 392 manifest_service_handle))) | 385 manifest_service_handle))) |
| 393 LOG(ERROR) << "Failed to send IPC channel handle to NaClProcessHost."; | 386 LOG(ERROR) << "Failed to send IPC channel handle to NaClProcessHost."; |
| 394 | 387 |
| 395 struct NaClChromeMainArgs* args = NaClChromeMainArgsCreate(); | 388 struct NaClChromeMainArgs* args = NaClChromeMainArgsCreate(); |
| 396 if (args == NULL) { | 389 if (args == NULL) { |
| 397 LOG(ERROR) << "NaClChromeMainArgsCreate() failed"; | 390 LOG(ERROR) << "NaClChromeMainArgsCreate() failed"; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 } | 500 } |
| 508 | 501 |
| 509 void NaClListener::OnFileTokenResolved( | 502 void NaClListener::OnFileTokenResolved( |
| 510 uint64_t token_lo, | 503 uint64_t token_lo, |
| 511 uint64_t token_hi, | 504 uint64_t token_hi, |
| 512 IPC::PlatformFileForTransit ipc_fd, | 505 IPC::PlatformFileForTransit ipc_fd, |
| 513 base::FilePath file_path) { | 506 base::FilePath file_path) { |
| 514 resolved_cb_.Run(ipc_fd, file_path); | 507 resolved_cb_.Run(ipc_fd, file_path); |
| 515 resolved_cb_.Reset(); | 508 resolved_cb_.Reset(); |
| 516 } | 509 } |
| OLD | NEW |