Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(342)

Side by Side Diff: components/nacl/loader/nacl_listener.cc

Issue 2301103003: Use ChannelMojo for NaCl PPAPI channels. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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>
(...skipping 24 matching lines...) Expand all
35 #include "ipc/ipc_channel_handle.h" 35 #include "ipc/ipc_channel_handle.h"
36 #include "ipc/ipc_sync_channel.h" 36 #include "ipc/ipc_sync_channel.h"
37 #include "ipc/ipc_sync_message_filter.h" 37 #include "ipc/ipc_sync_message_filter.h"
38 #include "mojo/edk/embedder/embedder.h" 38 #include "mojo/edk/embedder/embedder.h"
39 #include "mojo/edk/embedder/scoped_ipc_support.h" 39 #include "mojo/edk/embedder/scoped_ipc_support.h"
40 #include "native_client/src/public/chrome_main.h" 40 #include "native_client/src/public/chrome_main.h"
41 #include "native_client/src/public/nacl_app.h" 41 #include "native_client/src/public/nacl_app.h"
42 #include "native_client/src/public/nacl_desc.h" 42 #include "native_client/src/public/nacl_desc.h"
43 43
44 #if defined(OS_POSIX) 44 #if defined(OS_POSIX)
45 #include "base/file_descriptor_posix.h"
46 #include "base/posix/global_descriptors.h" 45 #include "base/posix/global_descriptors.h"
47 #include "content/public/common/content_descriptors.h" 46 #include "content/public/common/content_descriptors.h"
48 #endif 47 #endif
49 48
50 #if defined(OS_LINUX) 49 #if defined(OS_LINUX)
51 #include "content/public/common/child_process_sandbox_support_linux.h" 50 #include "content/public/common/child_process_sandbox_support_linux.h"
52 #endif 51 #endif
53 52
54 #if defined(OS_WIN) 53 #if defined(OS_WIN)
55 #include <io.h> 54 #include <io.h>
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 // the given task runner runs. 109 // the given task runner runs.
111 // Also, creates and sets the corresponding NaClDesc to the given nap with 110 // Also, creates and sets the corresponding NaClDesc to the given nap with
112 // the FD #. 111 // the FD #.
113 void SetUpIPCAdapter( 112 void SetUpIPCAdapter(
114 IPC::ChannelHandle* handle, 113 IPC::ChannelHandle* handle,
115 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 114 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
116 struct NaClApp* nap, 115 struct NaClApp* nap,
117 int nacl_fd, 116 int nacl_fd,
118 NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, 117 NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb,
119 NaClIPCAdapter::OpenResourceCallback open_resource_cb) { 118 NaClIPCAdapter::OpenResourceCallback open_resource_cb) {
120 scoped_refptr<NaClIPCAdapter> ipc_adapter(new NaClIPCAdapter( 119 mojo::MessagePipe pipe;
121 *handle, task_runner.get(), resolve_file_token_cb, open_resource_cb)); 120 scoped_refptr<NaClIPCAdapter> ipc_adapter(
121 new NaClIPCAdapter(pipe.handle0.release(), task_runner,
122 resolve_file_token_cb, open_resource_cb));
122 ipc_adapter->ConnectChannel(); 123 ipc_adapter->ConnectChannel();
123 #if defined(OS_POSIX) 124 *handle = pipe.handle1.release();
124 handle->socket =
125 base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor());
126 #endif
127 125
128 // Pass a NaClDesc to the untrusted side. This will hold a ref to the 126 // Pass a NaClDesc to the untrusted side. This will hold a ref to the
129 // NaClIPCAdapter. 127 // NaClIPCAdapter.
130 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); 128 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc());
131 } 129 }
132 130
133 } // namespace 131 } // namespace
134 132
135 class BrowserValidationDBProxy : public NaClValidationDB { 133 class BrowserValidationDBProxy : public NaClValidationDB {
136 public: 134 public:
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 private: 237 private:
240 ~FileTokenMessageFilter() override {} 238 ~FileTokenMessageFilter() override {}
241 }; 239 };
242 240
243 void NaClListener::Listen() { 241 void NaClListener::Listen() {
244 mojo::ScopedMessagePipeHandle handle( 242 mojo::ScopedMessagePipeHandle handle(
245 mojo::edk::CreateChildMessagePipe( 243 mojo::edk::CreateChildMessagePipe(
246 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 244 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
247 switches::kMojoChannelToken))); 245 switches::kMojoChannelToken)));
248 DCHECK(handle.is_valid()); 246 DCHECK(handle.is_valid());
249 IPC::ChannelHandle channel_handle(handle.release());
250 247
251 channel_ = IPC::SyncChannel::Create(this, io_thread_.task_runner().get(), 248 channel_ = IPC::SyncChannel::Create(this, io_thread_.task_runner().get(),
252 &shutdown_event_); 249 &shutdown_event_);
253 filter_ = channel_->CreateSyncMessageFilter(); 250 filter_ = channel_->CreateSyncMessageFilter();
254 channel_->AddFilter(new FileTokenMessageFilter()); 251 channel_->AddFilter(new FileTokenMessageFilter());
255 IPC::AttachmentBroker* global = IPC::AttachmentBroker::GetGlobal(); 252 IPC::AttachmentBroker* global = IPC::AttachmentBroker::GetGlobal();
256 if (global && !global->IsPrivilegedBroker()) 253 if (global && !global->IsPrivilegedBroker())
257 global->RegisterBrokerCommunicationChannel(channel_.get()); 254 global->RegisterBrokerCommunicationChannel(channel_.get());
258 channel_->Init(channel_handle, IPC::Channel::MODE_CLIENT, true); 255 channel_->Init(handle.release(), IPC::Channel::MODE_CLIENT, true);
259 main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 256 main_task_runner_ = base::ThreadTaskRunnerHandle::Get();
260 base::RunLoop().Run(); 257 base::RunLoop().Run();
261 } 258 }
262 259
263 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { 260 bool NaClListener::OnMessageReceived(const IPC::Message& msg) {
264 bool handled = true; 261 bool handled = true;
265 IPC_BEGIN_MESSAGE_MAP(NaClListener, msg) 262 IPC_BEGIN_MESSAGE_MAP(NaClListener, msg)
266 IPC_MESSAGE_HANDLER(NaClProcessMsg_AddPrefetchedResource, 263 IPC_MESSAGE_HANDLER(NaClProcessMsg_AddPrefetchedResource,
267 OnAddPrefetchedResource) 264 OnAddPrefetchedResource)
268 IPC_MESSAGE_HANDLER(NaClProcessMsg_Start, OnStart) 265 IPC_MESSAGE_HANDLER(NaClProcessMsg_Start, OnStart)
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 crash_info_shmem_.reset(new base::SharedMemory( 326 crash_info_shmem_.reset(new base::SharedMemory(
330 params.crash_info_shmem_handle, false /* not readonly */)); 327 params.crash_info_shmem_handle, false /* not readonly */));
331 CHECK(crash_info_shmem_->Map(nacl::kNaClCrashInfoShmemSize)); 328 CHECK(crash_info_shmem_->Map(nacl::kNaClCrashInfoShmemSize));
332 NaClSetFatalErrorCallback(&FatalLogHandler); 329 NaClSetFatalErrorCallback(&FatalLogHandler);
333 330
334 nap = NaClAppCreate(); 331 nap = NaClAppCreate();
335 if (nap == NULL) { 332 if (nap == NULL) {
336 LOG(FATAL) << "NaClAppCreate() failed"; 333 LOG(FATAL) << "NaClAppCreate() failed";
337 } 334 }
338 335
339 IPC::ChannelHandle browser_handle = 336 IPC::ChannelHandle browser_handle;
340 IPC::Channel::GenerateVerifiedChannelID("nacl"); 337 IPC::ChannelHandle ppapi_renderer_handle;
341 IPC::ChannelHandle ppapi_renderer_handle = 338 IPC::ChannelHandle manifest_service_handle;
342 IPC::Channel::GenerateVerifiedChannelID("nacl");
343 IPC::ChannelHandle manifest_service_handle =
344 IPC::Channel::GenerateVerifiedChannelID("nacl");
345 339
346 // Create the PPAPI IPC channels between the NaCl IRT and the host 340 // Create the PPAPI IPC channels between the NaCl IRT and the host
347 // (browser/renderer) processes. The IRT uses these channels to 341 // (browser/renderer) processes. The IRT uses these channels to
348 // communicate with the host and to initialize the IPC dispatchers. 342 // communicate with the host and to initialize the IPC dispatchers.
349 SetUpIPCAdapter(&browser_handle, io_thread_.task_runner(), nap, 343 SetUpIPCAdapter(&browser_handle, io_thread_.task_runner(), nap,
350 NACL_CHROME_DESC_BASE, 344 NACL_CHROME_DESC_BASE,
351 NaClIPCAdapter::ResolveFileTokenCallback(), 345 NaClIPCAdapter::ResolveFileTokenCallback(),
352 NaClIPCAdapter::OpenResourceCallback()); 346 NaClIPCAdapter::OpenResourceCallback());
353 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.task_runner(), nap, 347 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.task_runner(), nap,
354 NACL_CHROME_DESC_BASE + 1, 348 NACL_CHROME_DESC_BASE + 1,
355 NaClIPCAdapter::ResolveFileTokenCallback(), 349 NaClIPCAdapter::ResolveFileTokenCallback(),
356 NaClIPCAdapter::OpenResourceCallback()); 350 NaClIPCAdapter::OpenResourceCallback());
357 SetUpIPCAdapter( 351 SetUpIPCAdapter(
358 &manifest_service_handle, io_thread_.task_runner(), nap, 352 &manifest_service_handle, io_thread_.task_runner(), nap,
359 NACL_CHROME_DESC_BASE + 2, 353 NACL_CHROME_DESC_BASE + 2,
360 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)), 354 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)),
361 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this))); 355 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this)));
362 356
357 mojo::MessagePipe trusted_pipe;
363 trusted_listener_ = 358 trusted_listener_ =
364 new NaClTrustedListener(IPC::Channel::GenerateVerifiedChannelID("nacl"), 359 new NaClTrustedListener(trusted_pipe.handle0.release(),
365 io_thread_.task_runner().get(), &shutdown_event_); 360 io_thread_.task_runner().get(), &shutdown_event_);
366 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( 361 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated(
367 browser_handle, 362 browser_handle, ppapi_renderer_handle, trusted_pipe.handle1.release(),
368 ppapi_renderer_handle,
369 trusted_listener_->TakeClientChannelHandle(),
370 manifest_service_handle))) 363 manifest_service_handle)))
371 LOG(FATAL) << "Failed to send IPC channel handle to NaClProcessHost."; 364 LOG(FATAL) << "Failed to send IPC channel handle to NaClProcessHost.";
372 365
373 struct NaClChromeMainArgs* args = NaClChromeMainArgsCreate(); 366 struct NaClChromeMainArgs* args = NaClChromeMainArgsCreate();
374 if (args == NULL) { 367 if (args == NULL) {
375 LOG(FATAL) << "NaClChromeMainArgsCreate() failed"; 368 LOG(FATAL) << "NaClChromeMainArgsCreate() failed";
376 } 369 }
377 370
378 #if defined(OS_POSIX) 371 #if defined(OS_POSIX)
379 args->number_of_cores = number_of_cores_; 372 args->number_of_cores = number_of_cores_;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 } 467 }
475 468
476 void NaClListener::OnFileTokenResolved( 469 void NaClListener::OnFileTokenResolved(
477 uint64_t token_lo, 470 uint64_t token_lo,
478 uint64_t token_hi, 471 uint64_t token_hi,
479 IPC::PlatformFileForTransit ipc_fd, 472 IPC::PlatformFileForTransit ipc_fd,
480 base::FilePath file_path) { 473 base::FilePath file_path) {
481 resolved_cb_.Run(ipc_fd, file_path); 474 resolved_cb_.Run(ipc_fd, file_path);
482 resolved_cb_.Reset(); 475 resolved_cb_.Reset();
483 } 476 }
OLDNEW
« no previous file with comments | « components/nacl/loader/nacl_ipc_adapter.cc ('k') | components/nacl/loader/nacl_trusted_listener.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698