Chromium Code Reviews| 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> |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 | 268 |
| 269 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { | 269 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { |
| 270 bool handled = true; | 270 bool handled = true; |
| 271 IPC_BEGIN_MESSAGE_MAP(NaClListener, msg) | 271 IPC_BEGIN_MESSAGE_MAP(NaClListener, msg) |
| 272 IPC_MESSAGE_HANDLER(NaClProcessMsg_Start, OnStart) | 272 IPC_MESSAGE_HANDLER(NaClProcessMsg_Start, OnStart) |
| 273 IPC_MESSAGE_UNHANDLED(handled = false) | 273 IPC_MESSAGE_UNHANDLED(handled = false) |
| 274 IPC_END_MESSAGE_MAP() | 274 IPC_END_MESSAGE_MAP() |
| 275 return handled; | 275 return handled; |
| 276 } | 276 } |
| 277 | 277 |
| 278 bool NaClListener::OnOpenResource( | |
| 279 const IPC::Message& msg, | |
| 280 const std::string& key, | |
| 281 NaClIPCAdapter::OpenResourceReplyCallback cb) { | |
| 282 DCHECK(!cb.is_null()); | |
| 283 std::map<std::string, std::pair< | |
|
Mark Seaborn
2015/03/20 00:40:52
Nit: Define a typedef for this std::map?
Yusuke Sato
2015/04/16 02:38:45
Done.
| |
| 284 IPC::PlatformFileForTransit, base::FilePath> >::iterator it; | |
| 285 | |
| 286 const std::string files_prefix = "files/"; | |
| 287 if (key.find(files_prefix) == 0) | |
|
Mark Seaborn
2015/03/20 00:40:52
You're stripping off the "files/" prefix which is
Yusuke Sato
2015/04/16 02:38:45
Sure, let me add a TODO for now.
Yusuke Sato
2015/04/16 03:51:14
https://codereview.chromium.org/1070233007/
| |
| 288 it = prefetched_resource_files_.find(key.substr(files_prefix.length())); | |
|
Mark Seaborn
2015/03/20 00:40:52
Can you comment this as a fast path, like how it's
Yusuke Sato
2015/04/16 02:38:45
Done.
| |
| 289 else | |
| 290 it = prefetched_resource_files_.find(key); | |
| 291 | |
| 292 if (it != prefetched_resource_files_.end()) { | |
| 293 IPC::PlatformFileForTransit file = it->second.first; | |
| 294 base::FilePath path = it->second.second; | |
| 295 prefetched_resource_files_.erase(it); | |
|
Mark Seaborn
2015/03/20 00:40:52
Can you add a comment saying why this is thread-sa
Yusuke Sato
2015/04/16 02:38:45
Done.
| |
| 296 // A pre-opened resource descriptor is available. Run the reply callback | |
| 297 // and return true. | |
| 298 cb.Run(msg, file, path); | |
| 299 return true; | |
| 300 } | |
| 301 | |
| 302 // Return false to let the IPC adapter issue an IPC to the renderer. | |
|
Mark Seaborn
2015/03/20 00:40:52
...and fall back to the slow path.
Yusuke Sato
2015/04/16 02:38:45
Done.
| |
| 303 return false; | |
| 304 } | |
| 305 | |
| 278 void NaClListener::OnStart(const nacl::NaClStartParams& params) { | 306 void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
| 279 #if defined(OS_LINUX) || defined(OS_MACOSX) | 307 #if defined(OS_LINUX) || defined(OS_MACOSX) |
| 280 int urandom_fd = dup(base::GetUrandomFD()); | 308 int urandom_fd = dup(base::GetUrandomFD()); |
| 281 if (urandom_fd < 0) { | 309 if (urandom_fd < 0) { |
| 282 LOG(ERROR) << "Failed to dup() the urandom FD"; | 310 LOG(ERROR) << "Failed to dup() the urandom FD"; |
| 283 return; | 311 return; |
| 284 } | 312 } |
| 285 NaClChromeMainSetUrandomFd(urandom_fd); | 313 NaClChromeMainSetUrandomFd(urandom_fd); |
| 286 #endif | 314 #endif |
| 287 struct NaClApp* nap = NULL; | 315 struct NaClApp* nap = NULL; |
| 288 NaClChromeMainInit(); | 316 NaClChromeMainInit(); |
| 289 | 317 |
| 290 crash_info_shmem_.reset(new base::SharedMemory(params.crash_info_shmem_handle, | 318 crash_info_shmem_.reset(new base::SharedMemory(params.crash_info_shmem_handle, |
| 291 false)); | 319 false)); |
| 292 CHECK(crash_info_shmem_->Map(nacl::kNaClCrashInfoShmemSize)); | 320 CHECK(crash_info_shmem_->Map(nacl::kNaClCrashInfoShmemSize)); |
| 293 NaClSetFatalErrorCallback(&FatalLogHandler); | 321 NaClSetFatalErrorCallback(&FatalLogHandler); |
| 294 | 322 |
| 295 nap = NaClAppCreate(); | 323 nap = NaClAppCreate(); |
| 296 if (nap == NULL) { | 324 if (nap == NULL) { |
| 297 LOG(ERROR) << "NaClAppCreate() failed"; | 325 LOG(ERROR) << "NaClAppCreate() failed"; |
| 298 return; | 326 return; |
| 299 } | 327 } |
| 300 | 328 |
| 301 IPC::ChannelHandle browser_handle; | 329 IPC::ChannelHandle browser_handle; |
| 302 IPC::ChannelHandle ppapi_renderer_handle; | 330 IPC::ChannelHandle ppapi_renderer_handle; |
| 303 IPC::ChannelHandle manifest_service_handle; | 331 IPC::ChannelHandle manifest_service_handle; |
| 304 | 332 |
| 333 for (size_t i = 0; i < params.prefetched_resource_files.size(); ++i) { | |
| 334 bool result = prefetched_resource_files_.insert(std::make_pair( | |
| 335 params.prefetched_resource_files[i].file_key, | |
| 336 std::make_pair( | |
| 337 params.prefetched_resource_files[i].file, | |
| 338 params.prefetched_resource_files[i].file_path_metadata))).second; | |
| 339 if (!result) { | |
| 340 DLOG(ERROR) << "Duplicated open_resource key: " | |
| 341 << params.prefetched_resource_files[i].file_key; | |
| 342 } | |
| 343 } | |
| 344 | |
| 305 if (params.enable_ipc_proxy) { | 345 if (params.enable_ipc_proxy) { |
| 306 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 346 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 307 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 347 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 308 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 348 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 309 | 349 |
| 310 // Create the PPAPI IPC channels between the NaCl IRT and the host | 350 // Create the PPAPI IPC channels between the NaCl IRT and the host |
| 311 // (browser/renderer) processes. The IRT uses these channels to | 351 // (browser/renderer) processes. The IRT uses these channels to |
| 312 // communicate with the host and to initialize the IPC dispatchers. | 352 // communicate with the host and to initialize the IPC dispatchers. |
| 313 SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), | 353 SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), |
| 314 nap, NACL_CHROME_DESC_BASE); | 354 nap, NACL_CHROME_DESC_BASE); |
| 315 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), | 355 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), |
| 316 nap, NACL_CHROME_DESC_BASE + 1); | 356 nap, NACL_CHROME_DESC_BASE + 1); |
| 317 | 357 |
| 318 scoped_refptr<NaClIPCAdapter> manifest_ipc_adapter = | 358 scoped_refptr<NaClIPCAdapter> manifest_ipc_adapter = |
| 319 SetUpIPCAdapter(&manifest_service_handle, | 359 SetUpIPCAdapter(&manifest_service_handle, |
| 320 io_thread_.message_loop_proxy(), | 360 io_thread_.message_loop_proxy(), |
| 321 nap, | 361 nap, |
| 322 NACL_CHROME_DESC_BASE + 2); | 362 NACL_CHROME_DESC_BASE + 2); |
| 323 manifest_ipc_adapter->set_resolve_file_token_callback( | 363 manifest_ipc_adapter->set_resolve_file_token_callback( |
| 324 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this))); | 364 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this))); |
| 365 manifest_ipc_adapter->set_open_resource_callback( | |
| 366 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this))); | |
| 325 } | 367 } |
| 326 | 368 |
| 327 trusted_listener_ = new NaClTrustedListener( | 369 trusted_listener_ = new NaClTrustedListener( |
| 328 IPC::Channel::GenerateVerifiedChannelID("nacl"), | 370 IPC::Channel::GenerateVerifiedChannelID("nacl"), |
| 329 io_thread_.message_loop_proxy().get(), | 371 io_thread_.message_loop_proxy().get(), |
| 330 &shutdown_event_); | 372 &shutdown_event_); |
| 331 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( | 373 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( |
| 332 browser_handle, | 374 browser_handle, |
| 333 ppapi_renderer_handle, | 375 ppapi_renderer_handle, |
| 334 trusted_listener_->TakeClientChannelHandle(), | 376 trusted_listener_->TakeClientChannelHandle(), |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 441 // //mojo/nacl for implementation details. | 483 // //mojo/nacl for implementation details. |
| 442 InjectMojo(nap); | 484 InjectMojo(nap); |
| 443 } else { | 485 } else { |
| 444 // When Mojo isn't enabled, we inject a file descriptor that intentionally | 486 // When Mojo isn't enabled, we inject a file descriptor that intentionally |
| 445 // fails on any imc_sendmsg() call to make debugging easier. | 487 // fails on any imc_sendmsg() call to make debugging easier. |
| 446 InjectDisabledMojo(nap); | 488 InjectDisabledMojo(nap); |
| 447 } | 489 } |
| 448 #else | 490 #else |
| 449 InjectDisabledMojo(nap); | 491 InjectDisabledMojo(nap); |
| 450 #endif | 492 #endif |
| 451 // TODO(yusukes): Support pre-opening resource files. | |
| 452 CHECK(params.prefetched_resource_files.empty()); | |
| 453 | 493 |
| 454 int exit_status; | 494 int exit_status; |
| 455 if (!NaClChromeMainStart(nap, args, &exit_status)) | 495 if (!NaClChromeMainStart(nap, args, &exit_status)) |
| 456 NaClExit(1); | 496 NaClExit(1); |
| 457 | 497 |
| 458 // Report the plugin's exit status if the application started successfully. | 498 // Report the plugin's exit status if the application started successfully. |
| 459 trusted_listener_->Send(new NaClRendererMsg_ReportExitStatus(exit_status)); | 499 trusted_listener_->Send(new NaClRendererMsg_ReportExitStatus(exit_status)); |
| 460 NaClExit(exit_status); | 500 NaClExit(exit_status); |
| 461 } | 501 } |
| 462 | 502 |
| 463 void NaClListener::ResolveFileToken( | 503 void NaClListener::ResolveFileToken( |
| 464 uint64_t token_lo, | 504 uint64_t token_lo, |
| 465 uint64_t token_hi, | 505 uint64_t token_hi, |
| 466 base::Callback<void(IPC::PlatformFileForTransit, base::FilePath)> cb) { | 506 base::Callback<void(IPC::PlatformFileForTransit, base::FilePath)> cb) { |
| 467 if (!Send(new NaClProcessMsg_ResolveFileToken(token_lo, token_hi))) { | 507 if (!Send(new NaClProcessMsg_ResolveFileToken(token_lo, token_hi))) { |
| 468 cb.Run(IPC::PlatformFileForTransit(), base::FilePath()); | 508 cb.Run(IPC::PlatformFileForTransit(), base::FilePath()); |
| 469 return; | 509 return; |
| 470 } | 510 } |
| 471 resolved_cb_ = cb; | 511 resolved_cb_ = cb; |
| 472 } | 512 } |
| 473 | 513 |
| 474 void NaClListener::OnFileTokenResolved( | 514 void NaClListener::OnFileTokenResolved( |
| 475 uint64_t token_lo, | 515 uint64_t token_lo, |
| 476 uint64_t token_hi, | 516 uint64_t token_hi, |
| 477 IPC::PlatformFileForTransit ipc_fd, | 517 IPC::PlatformFileForTransit ipc_fd, |
| 478 base::FilePath file_path) { | 518 base::FilePath file_path) { |
| 479 resolved_cb_.Run(ipc_fd, file_path); | 519 resolved_cb_.Run(ipc_fd, file_path); |
| 480 resolved_cb_.Reset(); | 520 resolved_cb_.Reset(); |
| 481 } | 521 } |
| OLD | NEW |