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 // This callback is executed only on |io_thread_| with NaClIPCAdapter's | |
283 // |lock_| not being held. | |
284 DCHECK(!cb.is_null()); | |
285 PrefetchedResourceFilesMap::iterator it; | |
286 | |
287 // TODO(yusukes): Remove the prefix check. | |
288 const std::string files_prefix = "files/"; | |
289 if (key.find(files_prefix) == 0) | |
290 it = prefetched_resource_files_.find(key.substr(files_prefix.length())); | |
291 else | |
292 it = prefetched_resource_files_.find(key); | |
293 | |
294 if (it != prefetched_resource_files_.end()) { | |
295 // Fast path for prefetched FDs. | |
296 IPC::PlatformFileForTransit file = it->second.first; | |
297 base::FilePath path = it->second.second; | |
298 prefetched_resource_files_.erase(it); | |
299 // A pre-opened resource descriptor is available. Run the reply callback | |
300 // and return true. | |
301 cb.Run(msg, file, path); | |
302 return true; | |
303 } | |
304 | |
305 // Return false to fall back to the slow path. Let the IPC adapter issue an | |
306 // IPC to the renderer. | |
307 return false; | |
308 } | |
309 | |
278 void NaClListener::OnStart(const nacl::NaClStartParams& params) { | 310 void NaClListener::OnStart(const nacl::NaClStartParams& params) { |
279 #if defined(OS_LINUX) || defined(OS_MACOSX) | 311 #if defined(OS_LINUX) || defined(OS_MACOSX) |
280 int urandom_fd = dup(base::GetUrandomFD()); | 312 int urandom_fd = dup(base::GetUrandomFD()); |
281 if (urandom_fd < 0) { | 313 if (urandom_fd < 0) { |
282 LOG(ERROR) << "Failed to dup() the urandom FD"; | 314 LOG(ERROR) << "Failed to dup() the urandom FD"; |
283 return; | 315 return; |
284 } | 316 } |
285 NaClChromeMainSetUrandomFd(urandom_fd); | 317 NaClChromeMainSetUrandomFd(urandom_fd); |
286 #endif | 318 #endif |
287 struct NaClApp* nap = NULL; | 319 struct NaClApp* nap = NULL; |
288 NaClChromeMainInit(); | 320 NaClChromeMainInit(); |
289 | 321 |
290 crash_info_shmem_.reset(new base::SharedMemory(params.crash_info_shmem_handle, | 322 crash_info_shmem_.reset(new base::SharedMemory(params.crash_info_shmem_handle, |
291 false)); | 323 false)); |
292 CHECK(crash_info_shmem_->Map(nacl::kNaClCrashInfoShmemSize)); | 324 CHECK(crash_info_shmem_->Map(nacl::kNaClCrashInfoShmemSize)); |
293 NaClSetFatalErrorCallback(&FatalLogHandler); | 325 NaClSetFatalErrorCallback(&FatalLogHandler); |
294 | 326 |
295 nap = NaClAppCreate(); | 327 nap = NaClAppCreate(); |
296 if (nap == NULL) { | 328 if (nap == NULL) { |
297 LOG(ERROR) << "NaClAppCreate() failed"; | 329 LOG(ERROR) << "NaClAppCreate() failed"; |
298 return; | 330 return; |
299 } | 331 } |
300 | 332 |
301 IPC::ChannelHandle browser_handle; | 333 IPC::ChannelHandle browser_handle; |
302 IPC::ChannelHandle ppapi_renderer_handle; | 334 IPC::ChannelHandle ppapi_renderer_handle; |
303 IPC::ChannelHandle manifest_service_handle; | 335 IPC::ChannelHandle manifest_service_handle; |
304 | 336 |
337 for (size_t i = 0; i < params.prefetched_resource_files.size(); ++i) { | |
338 bool result = prefetched_resource_files_.insert(std::make_pair( | |
339 params.prefetched_resource_files[i].file_key, | |
340 std::make_pair( | |
341 params.prefetched_resource_files[i].file, | |
342 params.prefetched_resource_files[i].file_path_metadata))).second; | |
343 if (!result) { | |
344 DLOG(ERROR) << "Duplicated open_resource key: " | |
345 << params.prefetched_resource_files[i].file_key; | |
346 } | |
347 } | |
348 | |
305 if (params.enable_ipc_proxy) { | 349 if (params.enable_ipc_proxy) { |
306 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 350 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
307 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 351 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
308 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 352 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
309 | 353 |
310 // Create the PPAPI IPC channels between the NaCl IRT and the host | 354 // Create the PPAPI IPC channels between the NaCl IRT and the host |
311 // (browser/renderer) processes. The IRT uses these channels to | 355 // (browser/renderer) processes. The IRT uses these channels to |
312 // communicate with the host and to initialize the IPC dispatchers. | 356 // communicate with the host and to initialize the IPC dispatchers. |
313 SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), | 357 SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), |
314 nap, NACL_CHROME_DESC_BASE); | 358 nap, NACL_CHROME_DESC_BASE); |
315 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), | 359 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.message_loop_proxy(), |
316 nap, NACL_CHROME_DESC_BASE + 1); | 360 nap, NACL_CHROME_DESC_BASE + 1); |
317 | 361 |
318 scoped_refptr<NaClIPCAdapter> manifest_ipc_adapter = | 362 scoped_refptr<NaClIPCAdapter> manifest_ipc_adapter = |
319 SetUpIPCAdapter(&manifest_service_handle, | 363 SetUpIPCAdapter(&manifest_service_handle, |
320 io_thread_.message_loop_proxy(), | 364 io_thread_.message_loop_proxy(), |
321 nap, | 365 nap, |
322 NACL_CHROME_DESC_BASE + 2); | 366 NACL_CHROME_DESC_BASE + 2); |
323 manifest_ipc_adapter->set_resolve_file_token_callback( | 367 manifest_ipc_adapter->set_resolve_file_token_callback( |
Mark Seaborn
2015/04/16 19:00:31
Yesterday we discussed doing a small cleanup refac
Yusuke Sato
2015/04/16 20:22:02
Done in https://codereview.chromium.org/1090043002
| |
324 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this))); | 368 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this))); |
369 manifest_ipc_adapter->set_open_resource_callback( | |
370 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this))); | |
325 } | 371 } |
326 | 372 |
327 trusted_listener_ = new NaClTrustedListener( | 373 trusted_listener_ = new NaClTrustedListener( |
328 IPC::Channel::GenerateVerifiedChannelID("nacl"), | 374 IPC::Channel::GenerateVerifiedChannelID("nacl"), |
329 io_thread_.message_loop_proxy().get(), | 375 io_thread_.message_loop_proxy().get(), |
330 &shutdown_event_); | 376 &shutdown_event_); |
331 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( | 377 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( |
332 browser_handle, | 378 browser_handle, |
333 ppapi_renderer_handle, | 379 ppapi_renderer_handle, |
334 trusted_listener_->TakeClientChannelHandle(), | 380 trusted_listener_->TakeClientChannelHandle(), |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
431 if (params.enable_mojo) { | 477 if (params.enable_mojo) { |
432 // InjectMojo adds a file descriptor to the process that allows Mojo calls | 478 // InjectMojo adds a file descriptor to the process that allows Mojo calls |
433 // to use an implementation defined outside the NaCl sandbox. See | 479 // to use an implementation defined outside the NaCl sandbox. See |
434 // //mojo/nacl for implementation details. | 480 // //mojo/nacl for implementation details. |
435 InjectMojo(nap); | 481 InjectMojo(nap); |
436 } else { | 482 } else { |
437 // When Mojo isn't enabled, we inject a file descriptor that intentionally | 483 // When Mojo isn't enabled, we inject a file descriptor that intentionally |
438 // fails on any imc_sendmsg() call to make debugging easier. | 484 // fails on any imc_sendmsg() call to make debugging easier. |
439 InjectDisabledMojo(nap); | 485 InjectDisabledMojo(nap); |
440 } | 486 } |
441 // TODO(yusukes): Support pre-opening resource files. | |
442 CHECK(params.prefetched_resource_files.empty()); | |
443 | 487 |
444 int exit_status; | 488 int exit_status; |
445 if (!NaClChromeMainStart(nap, args, &exit_status)) | 489 if (!NaClChromeMainStart(nap, args, &exit_status)) |
446 NaClExit(1); | 490 NaClExit(1); |
447 | 491 |
448 // Report the plugin's exit status if the application started successfully. | 492 // Report the plugin's exit status if the application started successfully. |
449 trusted_listener_->Send(new NaClRendererMsg_ReportExitStatus(exit_status)); | 493 trusted_listener_->Send(new NaClRendererMsg_ReportExitStatus(exit_status)); |
450 NaClExit(exit_status); | 494 NaClExit(exit_status); |
451 } | 495 } |
452 | 496 |
453 void NaClListener::ResolveFileToken( | 497 void NaClListener::ResolveFileToken( |
454 uint64_t token_lo, | 498 uint64_t token_lo, |
455 uint64_t token_hi, | 499 uint64_t token_hi, |
456 base::Callback<void(IPC::PlatformFileForTransit, base::FilePath)> cb) { | 500 base::Callback<void(IPC::PlatformFileForTransit, base::FilePath)> cb) { |
457 if (!Send(new NaClProcessMsg_ResolveFileToken(token_lo, token_hi))) { | 501 if (!Send(new NaClProcessMsg_ResolveFileToken(token_lo, token_hi))) { |
458 cb.Run(IPC::PlatformFileForTransit(), base::FilePath()); | 502 cb.Run(IPC::PlatformFileForTransit(), base::FilePath()); |
459 return; | 503 return; |
460 } | 504 } |
461 resolved_cb_ = cb; | 505 resolved_cb_ = cb; |
462 } | 506 } |
463 | 507 |
464 void NaClListener::OnFileTokenResolved( | 508 void NaClListener::OnFileTokenResolved( |
465 uint64_t token_lo, | 509 uint64_t token_lo, |
466 uint64_t token_hi, | 510 uint64_t token_hi, |
467 IPC::PlatformFileForTransit ipc_fd, | 511 IPC::PlatformFileForTransit ipc_fd, |
468 base::FilePath file_path) { | 512 base::FilePath file_path) { |
469 resolved_cb_.Run(ipc_fd, file_path); | 513 resolved_cb_.Run(ipc_fd, file_path); |
470 resolved_cb_.Reset(); | 514 resolved_cb_.Reset(); |
471 } | 515 } |
OLD | NEW |