| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/nacl_host/nacl_process_host.h" | 5 #include "chrome/browser/nacl_host/nacl_process_host.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 // for this use case. | 138 // for this use case. |
| 139 process_->SetName(net::FormatUrl(manifest_url_, std::string())); | 139 process_->SetName(net::FormatUrl(manifest_url_, std::string())); |
| 140 | 140 |
| 141 // We allow untrusted hardware exception handling to be enabled via | 141 // We allow untrusted hardware exception handling to be enabled via |
| 142 // an env var for consistency with the standalone build of NaCl. | 142 // an env var for consistency with the standalone build of NaCl. |
| 143 if (CommandLine::ForCurrentProcess()->HasSwitch( | 143 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 144 switches::kEnableNaClExceptionHandling) || | 144 switches::kEnableNaClExceptionHandling) || |
| 145 getenv("NACL_UNTRUSTED_EXCEPTION_HANDLING") != NULL) { | 145 getenv("NACL_UNTRUSTED_EXCEPTION_HANDLING") != NULL) { |
| 146 enable_exception_handling_ = true; | 146 enable_exception_handling_ = true; |
| 147 } | 147 } |
| 148 |
| 149 enable_ipc_proxy_ = CommandLine::ForCurrentProcess()->HasSwitch( |
| 150 switches::kEnableNaClIPCProxy); |
| 148 } | 151 } |
| 149 | 152 |
| 150 NaClProcessHost::~NaClProcessHost() { | 153 NaClProcessHost::~NaClProcessHost() { |
| 151 int exit_code; | 154 int exit_code; |
| 152 process_->GetTerminationStatus(&exit_code); | 155 process_->GetTerminationStatus(&exit_code); |
| 153 std::string message = | 156 std::string message = |
| 154 base::StringPrintf("NaCl process exited with status %i (0x%x)", | 157 base::StringPrintf("NaCl process exited with status %i (0x%x)", |
| 155 exit_code, exit_code); | 158 exit_code, exit_code); |
| 156 if (exit_code == 0) { | 159 if (exit_code == 0) { |
| 157 LOG(INFO) << message; | 160 LOG(INFO) << message; |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 bool handled = true; | 533 bool handled = true; |
| 531 IPC_BEGIN_MESSAGE_MAP(NaClProcessHost, msg) | 534 IPC_BEGIN_MESSAGE_MAP(NaClProcessHost, msg) |
| 532 IPC_MESSAGE_HANDLER(NaClProcessMsg_QueryKnownToValidate, | 535 IPC_MESSAGE_HANDLER(NaClProcessMsg_QueryKnownToValidate, |
| 533 OnQueryKnownToValidate) | 536 OnQueryKnownToValidate) |
| 534 IPC_MESSAGE_HANDLER(NaClProcessMsg_SetKnownToValidate, | 537 IPC_MESSAGE_HANDLER(NaClProcessMsg_SetKnownToValidate, |
| 535 OnSetKnownToValidate) | 538 OnSetKnownToValidate) |
| 536 #if defined(OS_WIN) | 539 #if defined(OS_WIN) |
| 537 IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClProcessMsg_AttachDebugExceptionHandler, | 540 IPC_MESSAGE_HANDLER_DELAY_REPLY(NaClProcessMsg_AttachDebugExceptionHandler, |
| 538 OnAttachDebugExceptionHandler) | 541 OnAttachDebugExceptionHandler) |
| 539 #endif | 542 #endif |
| 543 IPC_MESSAGE_HANDLER(NaClProcessHostMsg_PpapiChannelCreated, |
| 544 OnPpapiChannelCreated) |
| 540 IPC_MESSAGE_UNHANDLED(handled = false) | 545 IPC_MESSAGE_UNHANDLED(handled = false) |
| 541 IPC_END_MESSAGE_MAP() | 546 IPC_END_MESSAGE_MAP() |
| 542 return handled; | 547 return handled; |
| 543 } | 548 } |
| 544 | 549 |
| 545 void NaClProcessHost::OnProcessLaunched() { | 550 void NaClProcessHost::OnProcessLaunched() { |
| 546 if (!StartWithLaunchedProcess()) | 551 if (!StartWithLaunchedProcess()) |
| 547 delete this; | 552 delete this; |
| 548 } | 553 } |
| 549 | 554 |
| 550 // Called when the NaClBrowser singleton has been fully initialized. | 555 // Called when the NaClBrowser singleton has been fully initialized. |
| 551 void NaClProcessHost::OnResourcesReady() { | 556 void NaClProcessHost::OnResourcesReady() { |
| 552 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); | 557 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); |
| 553 if (!nacl_browser->IsReady() || !SendStart()) { | 558 if (!nacl_browser->IsReady() || !SendStart()) { |
| 554 DLOG(ERROR) << "Cannot launch NaCl process"; | 559 DLOG(ERROR) << "Cannot launch NaCl process"; |
| 555 delete this; | 560 delete this; |
| 556 } | 561 } |
| 557 } | 562 } |
| 558 | 563 |
| 559 bool NaClProcessHost::ReplyToRenderer() { | 564 bool NaClProcessHost::ReplyToRenderer( |
| 565 const IPC::ChannelHandle& channel_handle) { |
| 560 std::vector<nacl::FileDescriptor> handles_for_renderer; | 566 std::vector<nacl::FileDescriptor> handles_for_renderer; |
| 561 for (size_t i = 0; i < internal_->sockets_for_renderer.size(); i++) { | 567 for (size_t i = 0; i < internal_->sockets_for_renderer.size(); i++) { |
| 562 #if defined(OS_WIN) | 568 #if defined(OS_WIN) |
| 563 // Copy the handle into the renderer process. | 569 // Copy the handle into the renderer process. |
| 564 HANDLE handle_in_renderer; | 570 HANDLE handle_in_renderer; |
| 565 if (!DuplicateHandle(base::GetCurrentProcessHandle(), | 571 if (!DuplicateHandle(base::GetCurrentProcessHandle(), |
| 566 reinterpret_cast<HANDLE>( | 572 reinterpret_cast<HANDLE>( |
| 567 internal_->sockets_for_renderer[i]), | 573 internal_->sockets_for_renderer[i]), |
| 568 chrome_render_message_filter_->peer_handle(), | 574 chrome_render_message_filter_->peer_handle(), |
| 569 &handle_in_renderer, | 575 &handle_in_renderer, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 593 // BrokerDuplicateHandle(). | 599 // BrokerDuplicateHandle(). |
| 594 if (RunningOnWOW64()) { | 600 if (RunningOnWOW64()) { |
| 595 if (!content::BrokerAddTargetPeer(process_->GetData().handle)) { | 601 if (!content::BrokerAddTargetPeer(process_->GetData().handle)) { |
| 596 DLOG(ERROR) << "Failed to add NaCl process PID"; | 602 DLOG(ERROR) << "Failed to add NaCl process PID"; |
| 597 return false; | 603 return false; |
| 598 } | 604 } |
| 599 } | 605 } |
| 600 #endif | 606 #endif |
| 601 | 607 |
| 602 ChromeViewHostMsg_LaunchNaCl::WriteReplyParams( | 608 ChromeViewHostMsg_LaunchNaCl::WriteReplyParams( |
| 603 reply_msg_, handles_for_renderer); | 609 reply_msg_, handles_for_renderer, channel_handle); |
| 604 chrome_render_message_filter_->Send(reply_msg_); | 610 chrome_render_message_filter_->Send(reply_msg_); |
| 605 chrome_render_message_filter_ = NULL; | 611 chrome_render_message_filter_ = NULL; |
| 606 reply_msg_ = NULL; | 612 reply_msg_ = NULL; |
| 607 internal_->sockets_for_renderer.clear(); | 613 internal_->sockets_for_renderer.clear(); |
| 608 return true; | 614 return true; |
| 609 } | 615 } |
| 610 | 616 |
| 611 bool NaClProcessHost::StartNaClExecution() { | 617 bool NaClProcessHost::StartNaClExecution() { |
| 612 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); | 618 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); |
| 613 | 619 |
| 614 nacl::NaClStartParams params; | 620 nacl::NaClStartParams params; |
| 615 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); | 621 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); |
| 616 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); | 622 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); |
| 617 params.version = chrome::VersionInfo().CreateVersionString(); | 623 params.version = chrome::VersionInfo().CreateVersionString(); |
| 618 params.enable_exception_handling = enable_exception_handling_; | 624 params.enable_exception_handling = enable_exception_handling_; |
| 619 params.enable_debug_stub = | 625 params.enable_debug_stub = |
| 620 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableNaClDebug); | 626 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableNaClDebug); |
| 627 params.enable_ipc_proxy = enable_ipc_proxy_; |
| 621 | 628 |
| 622 base::PlatformFile irt_file = nacl_browser->IrtFile(); | 629 base::PlatformFile irt_file = nacl_browser->IrtFile(); |
| 623 CHECK_NE(irt_file, base::kInvalidPlatformFileValue); | 630 CHECK_NE(irt_file, base::kInvalidPlatformFileValue); |
| 624 | 631 |
| 625 const ChildProcessData& data = process_->GetData(); | 632 const ChildProcessData& data = process_->GetData(); |
| 626 for (size_t i = 0; i < internal_->sockets_for_sel_ldr.size(); i++) { | 633 for (size_t i = 0; i < internal_->sockets_for_sel_ldr.size(); i++) { |
| 627 if (!ShareHandleToSelLdr(data.handle, | 634 if (!ShareHandleToSelLdr(data.handle, |
| 628 internal_->sockets_for_sel_ldr[i], true, | 635 internal_->sockets_for_sel_ldr[i], true, |
| 629 ¶ms.handles)) { | 636 ¶ms.handles)) { |
| 630 return false; | 637 return false; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 658 params.handles.push_back(memory_fd); | 665 params.handles.push_back(memory_fd); |
| 659 #endif | 666 #endif |
| 660 | 667 |
| 661 process_->Send(new NaClProcessMsg_Start(params)); | 668 process_->Send(new NaClProcessMsg_Start(params)); |
| 662 | 669 |
| 663 internal_->sockets_for_sel_ldr.clear(); | 670 internal_->sockets_for_sel_ldr.clear(); |
| 664 return true; | 671 return true; |
| 665 } | 672 } |
| 666 | 673 |
| 667 bool NaClProcessHost::SendStart() { | 674 bool NaClProcessHost::SendStart() { |
| 668 return ReplyToRenderer() && StartNaClExecution(); | 675 if (!enable_ipc_proxy_) { |
| 676 if (!ReplyToRenderer(IPC::ChannelHandle())) |
| 677 return false; |
| 678 } |
| 679 return StartNaClExecution(); |
| 680 } |
| 681 |
| 682 void NaClProcessHost::OnPpapiChannelCreated( |
| 683 const IPC::ChannelHandle& channel_handle) { |
| 684 DCHECK(enable_ipc_proxy_); |
| 685 ReplyToRenderer(channel_handle); |
| 669 } | 686 } |
| 670 | 687 |
| 671 bool NaClProcessHost::StartWithLaunchedProcess() { | 688 bool NaClProcessHost::StartWithLaunchedProcess() { |
| 672 #if defined(OS_LINUX) | 689 #if defined(OS_LINUX) |
| 673 if (wait_for_nacl_gdb_) { | 690 if (wait_for_nacl_gdb_) { |
| 674 if (LaunchNaClGdb(base::GetProcId(process_->GetData().handle))) { | 691 if (LaunchNaClGdb(base::GetProcId(process_->GetData().handle))) { |
| 675 // We will be called with wait_for_nacl_gdb_ = false once debugger is | 692 // We will be called with wait_for_nacl_gdb_ = false once debugger is |
| 676 // attached to the program. | 693 // attached to the program. |
| 677 return true; | 694 return true; |
| 678 } | 695 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 } else { | 782 } else { |
| 766 NaClStartDebugExceptionHandlerThread( | 783 NaClStartDebugExceptionHandlerThread( |
| 767 process_handle.Take(), info, | 784 process_handle.Take(), info, |
| 768 base::MessageLoopProxy::current(), | 785 base::MessageLoopProxy::current(), |
| 769 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, | 786 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, |
| 770 weak_factory_.GetWeakPtr())); | 787 weak_factory_.GetWeakPtr())); |
| 771 return true; | 788 return true; |
| 772 } | 789 } |
| 773 } | 790 } |
| 774 #endif | 791 #endif |
| OLD | NEW |