| 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" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/path_service.h" | 13 #include "base/path_service.h" |
| 14 #include "base/string_number_conversions.h" | 14 #include "base/string_number_conversions.h" |
| 15 #include "base/string_split.h" | 15 #include "base/string_split.h" |
| 16 #include "base/string_util.h" | 16 #include "base/string_util.h" |
| 17 #include "base/stringprintf.h" | 17 #include "base/stringprintf.h" |
| 18 #include "base/utf_string_conversions.h" | 18 #include "base/utf_string_conversions.h" |
| 19 #include "base/win/windows_version.h" | 19 #include "base/win/windows_version.h" |
| 20 #include "build/build_config.h" | 20 #include "build/build_config.h" |
| 21 #include "chrome/browser/browser_process.h" |
| 21 #include "chrome/browser/extensions/extension_info_map.h" | 22 #include "chrome/browser/extensions/extension_info_map.h" |
| 23 #include "chrome/browser/io_thread.h" |
| 22 #include "chrome/browser/nacl_host/nacl_browser.h" | 24 #include "chrome/browser/nacl_host/nacl_browser.h" |
| 23 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" | 25 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
| 24 #include "chrome/common/chrome_constants.h" | 26 #include "chrome/common/chrome_constants.h" |
| 25 #include "chrome/common/chrome_paths.h" | 27 #include "chrome/common/chrome_paths.h" |
| 26 #include "chrome/common/chrome_switches.h" | 28 #include "chrome/common/chrome_switches.h" |
| 27 #include "chrome/common/chrome_version_info.h" | 29 #include "chrome/common/chrome_version_info.h" |
| 28 #include "chrome/common/logging_chrome.h" | 30 #include "chrome/common/logging_chrome.h" |
| 29 #include "chrome/common/nacl_cmd_line.h" | 31 #include "chrome/common/nacl_cmd_line.h" |
| 30 #include "chrome/common/nacl_messages.h" | 32 #include "chrome/common/nacl_messages.h" |
| 31 #include "chrome/common/render_messages.h" | 33 #include "chrome/common/render_messages.h" |
| 32 #include "chrome/common/url_constants.h" | 34 #include "chrome/common/url_constants.h" |
| 33 #include "content/public/browser/browser_child_process_host.h" | 35 #include "content/public/browser/browser_child_process_host.h" |
| 34 #include "content/public/browser/child_process_data.h" | 36 #include "content/public/browser/child_process_data.h" |
| 35 #include "content/public/common/child_process_host.h" | 37 #include "content/public/common/child_process_host.h" |
| 38 #include "ipc/ipc_channel.h" |
| 36 #include "ipc/ipc_switches.h" | 39 #include "ipc/ipc_switches.h" |
| 37 #include "native_client/src/shared/imc/nacl_imc.h" | 40 #include "native_client/src/shared/imc/nacl_imc.h" |
| 38 #include "net/base/net_util.h" | 41 #include "net/base/net_util.h" |
| 42 #include "ppapi/proxy/ppapi_messages.h" |
| 39 | 43 |
| 40 #if defined(OS_POSIX) | 44 #if defined(OS_POSIX) |
| 41 #include <fcntl.h> | 45 #include <fcntl.h> |
| 42 | 46 |
| 43 #include "ipc/ipc_channel_posix.h" | 47 #include "ipc/ipc_channel_posix.h" |
| 44 #elif defined(OS_WIN) | 48 #elif defined(OS_WIN) |
| 45 #include <windows.h> | 49 #include <windows.h> |
| 46 | 50 |
| 47 #include "base/threading/thread.h" | 51 #include "base/threading/thread.h" |
| 48 #include "base/process_util.h" | 52 #include "base/process_util.h" |
| 49 #include "base/win/scoped_handle.h" | 53 #include "base/win/scoped_handle.h" |
| 50 #include "chrome/browser/nacl_host/nacl_broker_service_win.h" | 54 #include "chrome/browser/nacl_host/nacl_broker_service_win.h" |
| 51 #include "chrome/common/nacl_debug_exception_handler_win.h" | 55 #include "chrome/common/nacl_debug_exception_handler_win.h" |
| 52 #include "content/public/common/sandbox_init.h" | 56 #include "content/public/common/sandbox_init.h" |
| 53 #endif | 57 #endif |
| 54 | 58 |
| 55 using content::BrowserThread; | 59 using content::BrowserThread; |
| 56 using content::ChildProcessData; | 60 using content::ChildProcessData; |
| 57 using content::ChildProcessHost; | 61 using content::ChildProcessHost; |
| 62 using ppapi::proxy::SerializedHandle; |
| 58 | 63 |
| 59 namespace { | 64 namespace { |
| 60 | 65 |
| 61 #if defined(OS_WIN) | 66 #if defined(OS_WIN) |
| 62 bool RunningOnWOW64() { | 67 bool RunningOnWOW64() { |
| 63 return (base::win::OSInfo::GetInstance()->wow64_status() == | 68 return (base::win::OSInfo::GetInstance()->wow64_status() == |
| 64 base::win::OSInfo::WOW64_ENABLED); | 69 base::win::OSInfo::WOW64_ENABLED); |
| 65 } | 70 } |
| 66 #endif | 71 #endif |
| 67 | 72 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 | 112 |
| 108 } // namespace | 113 } // namespace |
| 109 | 114 |
| 110 struct NaClProcessHost::NaClInternal { | 115 struct NaClProcessHost::NaClInternal { |
| 111 std::vector<nacl::Handle> sockets_for_renderer; | 116 std::vector<nacl::Handle> sockets_for_renderer; |
| 112 std::vector<nacl::Handle> sockets_for_sel_ldr; | 117 std::vector<nacl::Handle> sockets_for_sel_ldr; |
| 113 }; | 118 }; |
| 114 | 119 |
| 115 // ----------------------------------------------------------------------------- | 120 // ----------------------------------------------------------------------------- |
| 116 | 121 |
| 122 NaClProcessHost::PluginListener::PluginListener(NaClProcessHost* host) |
| 123 : host_(host) { |
| 124 } |
| 125 |
| 126 bool NaClProcessHost::PluginListener::OnMessageReceived( |
| 127 const IPC::Message& msg) { |
| 128 return host_->OnUntrustedMessageForwarded(msg); |
| 129 } |
| 130 |
| 117 NaClProcessHost::NaClProcessHost(const GURL& manifest_url, bool off_the_record) | 131 NaClProcessHost::NaClProcessHost(const GURL& manifest_url, bool off_the_record) |
| 118 : manifest_url_(manifest_url), | 132 : manifest_url_(manifest_url), |
| 119 #if defined(OS_WIN) | 133 #if defined(OS_WIN) |
| 120 process_launched_by_broker_(false), | 134 process_launched_by_broker_(false), |
| 121 #elif defined(OS_LINUX) | 135 #elif defined(OS_LINUX) |
| 122 wait_for_nacl_gdb_(false), | 136 wait_for_nacl_gdb_(false), |
| 123 #endif | 137 #endif |
| 124 reply_msg_(NULL), | 138 reply_msg_(NULL), |
| 125 #if defined(OS_WIN) | 139 #if defined(OS_WIN) |
| 126 debug_exception_handler_requested_(false), | 140 debug_exception_handler_requested_(false), |
| 127 #endif | 141 #endif |
| 128 internal_(new NaClInternal()), | 142 internal_(new NaClInternal()), |
| 129 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), | 143 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
| 130 enable_exception_handling_(false), | 144 enable_exception_handling_(false), |
| 131 enable_debug_stub_(false), | 145 enable_debug_stub_(false), |
| 132 off_the_record_(off_the_record) { | 146 off_the_record_(off_the_record), |
| 147 enable_ipc_proxy_(false), |
| 148 ALLOW_THIS_IN_INITIALIZER_LIST(ipc_plugin_listener_(this)) { |
| 133 process_.reset(content::BrowserChildProcessHost::Create( | 149 process_.reset(content::BrowserChildProcessHost::Create( |
| 134 content::PROCESS_TYPE_NACL_LOADER, this)); | 150 content::PROCESS_TYPE_NACL_LOADER, this)); |
| 135 | 151 |
| 136 // Set the display name so the user knows what plugin the process is running. | 152 // Set the display name so the user knows what plugin the process is running. |
| 137 // We aren't on the UI thread so getting the pref locale for language | 153 // We aren't on the UI thread so getting the pref locale for language |
| 138 // formatting isn't possible, so IDN will be lost, but this is probably OK | 154 // formatting isn't possible, so IDN will be lost, but this is probably OK |
| 139 // for this use case. | 155 // for this use case. |
| 140 process_->SetName(net::FormatUrl(manifest_url_, std::string())); | 156 process_->SetName(net::FormatUrl(manifest_url_, std::string())); |
| 141 | 157 |
| 142 // We allow untrusted hardware exception handling to be enabled via | 158 // We allow untrusted hardware exception handling to be enabled via |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 } | 690 } |
| 675 | 691 |
| 676 bool NaClProcessHost::SendStart() { | 692 bool NaClProcessHost::SendStart() { |
| 677 if (!enable_ipc_proxy_) { | 693 if (!enable_ipc_proxy_) { |
| 678 if (!ReplyToRenderer(IPC::ChannelHandle())) | 694 if (!ReplyToRenderer(IPC::ChannelHandle())) |
| 679 return false; | 695 return false; |
| 680 } | 696 } |
| 681 return StartNaClExecution(); | 697 return StartNaClExecution(); |
| 682 } | 698 } |
| 683 | 699 |
| 700 // This method is called when NaClProcessHostMsg_PpapiChannelCreated is |
| 701 // received or PpapiHostMsg_ChannelCreated is forwarded by our plugin |
| 702 // listener. |
| 684 void NaClProcessHost::OnPpapiChannelCreated( | 703 void NaClProcessHost::OnPpapiChannelCreated( |
| 685 const IPC::ChannelHandle& channel_handle) { | 704 const IPC::ChannelHandle& channel_handle) { |
| 686 DCHECK(enable_ipc_proxy_); | 705 DCHECK(enable_ipc_proxy_); |
| 687 ReplyToRenderer(channel_handle); | 706 // If the proxy channel is null, this must be the initial NaCl-Browser IPC |
| 707 // channel. |
| 708 if (!ipc_proxy_channel_.get()) { |
| 709 ipc_proxy_channel_.reset( |
| 710 new IPC::ChannelProxy(channel_handle, |
| 711 IPC::Channel::MODE_CLIENT, |
| 712 &ipc_plugin_listener_, |
| 713 base::MessageLoopProxy::current())); |
| 714 // Send a message to create the NaCl-Renderer channel. The handle is just |
| 715 // a place holder. |
| 716 ipc_proxy_channel_->Send( |
| 717 new PpapiMsg_CreateNaClChannel( |
| 718 chrome_render_message_filter_->render_process_id(), |
| 719 chrome_render_message_filter_->off_the_record(), |
| 720 SerializedHandle(SerializedHandle::CHANNEL_HANDLE, |
| 721 IPC::InvalidPlatformFileForTransit()))); |
| 722 } else if (reply_msg_) { |
| 723 // Otherwise, this must be a renderer channel. |
| 724 ReplyToRenderer(channel_handle); |
| 725 } else { |
| 726 // Attempt to open more than 1 renderer channel is not supported. |
| 727 // Shut down the NaCl process. |
| 728 process_->GetHost()->ForceShutdown(); |
| 729 } |
| 730 } |
| 731 |
| 732 bool NaClProcessHost::OnUntrustedMessageForwarded(const IPC::Message& msg) { |
| 733 // Handle messages that have been forwarded from our PluginListener. |
| 734 // These messages come from untrusted code so should be handled with care. |
| 735 bool handled = true; |
| 736 IPC_BEGIN_MESSAGE_MAP(NaClProcessHost, msg) |
| 737 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, |
| 738 OnPpapiChannelCreated) |
| 739 IPC_MESSAGE_UNHANDLED(handled = false) |
| 740 IPC_END_MESSAGE_MAP() |
| 741 return handled; |
| 688 } | 742 } |
| 689 | 743 |
| 690 bool NaClProcessHost::StartWithLaunchedProcess() { | 744 bool NaClProcessHost::StartWithLaunchedProcess() { |
| 691 #if defined(OS_LINUX) | 745 #if defined(OS_LINUX) |
| 692 if (wait_for_nacl_gdb_) { | 746 if (wait_for_nacl_gdb_) { |
| 693 if (LaunchNaClGdb(base::GetProcId(process_->GetData().handle))) { | 747 if (LaunchNaClGdb(base::GetProcId(process_->GetData().handle))) { |
| 694 // We will be called with wait_for_nacl_gdb_ = false once debugger is | 748 // We will be called with wait_for_nacl_gdb_ = false once debugger is |
| 695 // attached to the program. | 749 // attached to the program. |
| 696 return true; | 750 return true; |
| 697 } | 751 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 } else { | 838 } else { |
| 785 NaClStartDebugExceptionHandlerThread( | 839 NaClStartDebugExceptionHandlerThread( |
| 786 process_handle.Take(), info, | 840 process_handle.Take(), info, |
| 787 base::MessageLoopProxy::current(), | 841 base::MessageLoopProxy::current(), |
| 788 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, | 842 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, |
| 789 weak_factory_.GetWeakPtr())); | 843 weak_factory_.GetWeakPtr())); |
| 790 return true; | 844 return true; |
| 791 } | 845 } |
| 792 } | 846 } |
| 793 #endif | 847 #endif |
| OLD | NEW |