| 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 "components/nacl/browser/nacl_process_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/base_switches.h" | 11 #include "base/base_switches.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
| 15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 18 #include "base/process/launch.h" | 18 #include "base/process/launch.h" |
| 19 #include "base/process/process_iterator.h" | 19 #include "base/process/process_iterator.h" |
| 20 #include "base/rand_util.h" | 20 #include "base/rand_util.h" |
| 21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
| 22 #include "base/strings/string_split.h" | 22 #include "base/strings/string_split.h" |
| 23 #include "base/strings/string_util.h" | 23 #include "base/strings/string_util.h" |
| 24 #include "base/strings/stringprintf.h" | 24 #include "base/strings/stringprintf.h" |
| 25 #include "base/strings/utf_string_conversions.h" | 25 #include "base/strings/utf_string_conversions.h" |
| 26 #include "base/win/windows_version.h" | 26 #include "base/win/windows_version.h" |
| 27 #include "build/build_config.h" | 27 #include "build/build_config.h" |
| 28 #include "chrome/browser/nacl_host/nacl_host_message_filter.h" | |
| 29 #include "chrome/common/chrome_switches.h" | |
| 30 #include "components/nacl/browser/nacl_browser.h" | 28 #include "components/nacl/browser/nacl_browser.h" |
| 29 #include "components/nacl/browser/nacl_host_message_filter.h" |
| 31 #include "components/nacl/common/nacl_cmd_line.h" | 30 #include "components/nacl/common/nacl_cmd_line.h" |
| 32 #include "components/nacl/common/nacl_host_messages.h" | 31 #include "components/nacl/common/nacl_host_messages.h" |
| 33 #include "components/nacl/common/nacl_messages.h" | 32 #include "components/nacl/common/nacl_messages.h" |
| 34 #include "components/nacl/common/nacl_process_type.h" | 33 #include "components/nacl/common/nacl_process_type.h" |
| 35 #include "components/nacl/common/nacl_switches.h" | 34 #include "components/nacl/common/nacl_switches.h" |
| 36 #include "content/public/browser/browser_child_process_host.h" | 35 #include "content/public/browser/browser_child_process_host.h" |
| 37 #include "content/public/browser/browser_ppapi_host.h" | 36 #include "content/public/browser/browser_ppapi_host.h" |
| 38 #include "content/public/browser/child_process_data.h" | 37 #include "content/public/browser/child_process_data.h" |
| 39 #include "content/public/common/child_process_host.h" | 38 #include "content/public/common/child_process_host.h" |
| 40 #include "content/public/common/content_switches.h" | 39 #include "content/public/common/content_switches.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 51 | 50 |
| 52 #if defined(OS_POSIX) | 51 #if defined(OS_POSIX) |
| 53 #include <fcntl.h> | 52 #include <fcntl.h> |
| 54 | 53 |
| 55 #include "ipc/ipc_channel_posix.h" | 54 #include "ipc/ipc_channel_posix.h" |
| 56 #elif defined(OS_WIN) | 55 #elif defined(OS_WIN) |
| 57 #include <windows.h> | 56 #include <windows.h> |
| 58 | 57 |
| 59 #include "base/threading/thread.h" | 58 #include "base/threading/thread.h" |
| 60 #include "base/win/scoped_handle.h" | 59 #include "base/win/scoped_handle.h" |
| 61 #include "chrome/browser/nacl_host/nacl_broker_service_win.h" | 60 #include "components/nacl/browser/nacl_broker_service_win.h" |
| 62 #include "components/nacl/common/nacl_debug_exception_handler_win.h" | 61 #include "components/nacl/common/nacl_debug_exception_handler_win.h" |
| 63 #include "content/public/common/sandbox_init.h" | 62 #include "content/public/common/sandbox_init.h" |
| 64 #include "content/public/common/sandboxed_process_launcher_delegate.h" | 63 #include "content/public/common/sandboxed_process_launcher_delegate.h" |
| 65 #endif | 64 #endif |
| 66 | 65 |
| 67 using content::BrowserThread; | 66 using content::BrowserThread; |
| 68 using content::ChildProcessData; | 67 using content::ChildProcessData; |
| 69 using content::ChildProcessHost; | 68 using content::ChildProcessHost; |
| 70 using ppapi::proxy::SerializedHandle; | 69 using ppapi::proxy::SerializedHandle; |
| 71 | 70 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 ppapi::PpapiPermissions GetNaClPermissions(uint32 permission_bits) { | 192 ppapi::PpapiPermissions GetNaClPermissions(uint32 permission_bits) { |
| 194 // Only allow NaCl plugins to request certain permissions. We don't want | 193 // Only allow NaCl plugins to request certain permissions. We don't want |
| 195 // a compromised renderer to be able to start a nacl plugin with e.g. Flash | 194 // a compromised renderer to be able to start a nacl plugin with e.g. Flash |
| 196 // permissions which may expand the surface area of the sandbox. | 195 // permissions which may expand the surface area of the sandbox. |
| 197 uint32 masked_bits = permission_bits & ppapi::PERMISSION_DEV; | 196 uint32 masked_bits = permission_bits & ppapi::PERMISSION_DEV; |
| 198 return ppapi::PpapiPermissions::GetForCommandLine(masked_bits); | 197 return ppapi::PpapiPermissions::GetForCommandLine(masked_bits); |
| 199 } | 198 } |
| 200 | 199 |
| 201 } // namespace | 200 } // namespace |
| 202 | 201 |
| 202 namespace nacl { |
| 203 |
| 203 struct NaClProcessHost::NaClInternal { | 204 struct NaClProcessHost::NaClInternal { |
| 204 NaClHandle socket_for_renderer; | 205 NaClHandle socket_for_renderer; |
| 205 NaClHandle socket_for_sel_ldr; | 206 NaClHandle socket_for_sel_ldr; |
| 206 | 207 |
| 207 NaClInternal() | 208 NaClInternal() |
| 208 : socket_for_renderer(NACL_INVALID_HANDLE), | 209 : socket_for_renderer(NACL_INVALID_HANDLE), |
| 209 socket_for_sel_ldr(NACL_INVALID_HANDLE) { } | 210 socket_for_sel_ldr(NACL_INVALID_HANDLE) { } |
| 210 }; | 211 }; |
| 211 | 212 |
| 212 // ----------------------------------------------------------------------------- | 213 // ----------------------------------------------------------------------------- |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 } | 291 } |
| 291 | 292 |
| 292 if (reply_msg_) { | 293 if (reply_msg_) { |
| 293 // The process failed to launch for some reason. | 294 // The process failed to launch for some reason. |
| 294 // Don't keep the renderer hanging. | 295 // Don't keep the renderer hanging. |
| 295 reply_msg_->set_reply_error(); | 296 reply_msg_->set_reply_error(); |
| 296 nacl_host_message_filter_->Send(reply_msg_); | 297 nacl_host_message_filter_->Send(reply_msg_); |
| 297 } | 298 } |
| 298 #if defined(OS_WIN) | 299 #if defined(OS_WIN) |
| 299 if (process_launched_by_broker_) { | 300 if (process_launched_by_broker_) { |
| 300 NaClBrokerService::GetInstance()->OnLoaderDied(); | 301 nacl::NaClBrokerService::GetInstance()->OnLoaderDied(); |
| 301 } | 302 } |
| 302 #endif | 303 #endif |
| 303 } | 304 } |
| 304 | 305 |
| 305 void NaClProcessHost::OnProcessCrashed(int exit_status) { | 306 void NaClProcessHost::OnProcessCrashed(int exit_status) { |
| 306 if (enable_crash_throttling_ && | 307 if (enable_crash_throttling_ && |
| 307 !CommandLine::ForCurrentProcess()->HasSwitch( | 308 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 308 switches::kDisablePnaclCrashThrottling)) { | 309 switches::kDisablePnaclCrashThrottling)) { |
| 309 nacl::NaClBrowser::GetInstance()->OnProcessCrashed(); | 310 nacl::NaClBrowser::GetInstance()->OnProcessCrashed(); |
| 310 } | 311 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 327 "NaCl.nacl-gdb-script", | 328 "NaCl.nacl-gdb-script", |
| 328 !cmd->GetSwitchValuePath(switches::kNaClGdbScript).empty()); | 329 !cmd->GetSwitchValuePath(switches::kNaClGdbScript).empty()); |
| 329 UMA_HISTOGRAM_BOOLEAN( | 330 UMA_HISTOGRAM_BOOLEAN( |
| 330 "NaCl.enable-nacl-debug", | 331 "NaCl.enable-nacl-debug", |
| 331 cmd->HasSwitch(switches::kEnableNaClDebug)); | 332 cmd->HasSwitch(switches::kEnableNaClDebug)); |
| 332 nacl::NaClBrowser::GetDelegate()->SetDebugPatterns( | 333 nacl::NaClBrowser::GetDelegate()->SetDebugPatterns( |
| 333 cmd->GetSwitchValueASCII(switches::kNaClDebugMask)); | 334 cmd->GetSwitchValueASCII(switches::kNaClDebugMask)); |
| 334 } | 335 } |
| 335 | 336 |
| 336 void NaClProcessHost::Launch( | 337 void NaClProcessHost::Launch( |
| 337 NaClHostMessageFilter* nacl_host_message_filter, | 338 nacl::NaClHostMessageFilter* nacl_host_message_filter, |
| 338 IPC::Message* reply_msg, | 339 IPC::Message* reply_msg, |
| 339 const base::FilePath& manifest_path) { | 340 const base::FilePath& manifest_path) { |
| 340 nacl_host_message_filter_ = nacl_host_message_filter; | 341 nacl_host_message_filter_ = nacl_host_message_filter; |
| 341 reply_msg_ = reply_msg; | 342 reply_msg_ = reply_msg; |
| 342 manifest_path_ = manifest_path; | 343 manifest_path_ = manifest_path; |
| 343 | 344 |
| 344 // Do not launch the requested NaCl module if NaCl is marked "unstable" due | 345 // Do not launch the requested NaCl module if NaCl is marked "unstable" due |
| 345 // to too many crashes within a given time period. | 346 // to too many crashes within a given time period. |
| 346 if (enable_crash_throttling_ && | 347 if (enable_crash_throttling_ && |
| 347 !CommandLine::ForCurrentProcess()->HasSwitch( | 348 !CommandLine::ForCurrentProcess()->HasSwitch( |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); | 528 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); |
| 528 if (nacl::NaClBrowser::GetDelegate()->DialogsAreSuppressed()) | 529 if (nacl::NaClBrowser::GetDelegate()->DialogsAreSuppressed()) |
| 529 cmd_line->AppendSwitch(switches::kNoErrorDialogs); | 530 cmd_line->AppendSwitch(switches::kNoErrorDialogs); |
| 530 | 531 |
| 531 if (!nacl_loader_prefix.empty()) | 532 if (!nacl_loader_prefix.empty()) |
| 532 cmd_line->PrependWrapper(nacl_loader_prefix); | 533 cmd_line->PrependWrapper(nacl_loader_prefix); |
| 533 | 534 |
| 534 // On Windows we might need to start the broker process to launch a new loader | 535 // On Windows we might need to start the broker process to launch a new loader |
| 535 #if defined(OS_WIN) | 536 #if defined(OS_WIN) |
| 536 if (RunningOnWOW64()) { | 537 if (RunningOnWOW64()) { |
| 537 if (!NaClBrokerService::GetInstance()->LaunchLoader( | 538 if (!nacl::NaClBrokerService::GetInstance()->LaunchLoader( |
| 538 weak_factory_.GetWeakPtr(), channel_id)) { | 539 weak_factory_.GetWeakPtr(), channel_id)) { |
| 539 SendErrorToRenderer("broker service did not launch process"); | 540 SendErrorToRenderer("broker service did not launch process"); |
| 540 return false; | 541 return false; |
| 541 } | 542 } |
| 542 } else { | 543 } else { |
| 543 process_->Launch(new NaClSandboxedProcessLauncherDelegate, | 544 process_->Launch(new NaClSandboxedProcessLauncherDelegate, |
| 544 cmd_line.release()); | 545 cmd_line.release()); |
| 545 } | 546 } |
| 546 #elif defined(OS_POSIX) | 547 #elif defined(OS_POSIX) |
| 547 process_->Launch(nacl_loader_prefix.empty(), // use_zygote | 548 process_->Launch(nacl_loader_prefix.empty(), // use_zygote |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1002 LOG(ERROR) << "Failed to get process handle"; | 1003 LOG(ERROR) << "Failed to get process handle"; |
| 1003 return false; | 1004 return false; |
| 1004 } | 1005 } |
| 1005 | 1006 |
| 1006 attach_debug_exception_handler_reply_msg_.reset(reply_msg); | 1007 attach_debug_exception_handler_reply_msg_.reset(reply_msg); |
| 1007 // If the NaCl loader is 64-bit, the process running its debug | 1008 // If the NaCl loader is 64-bit, the process running its debug |
| 1008 // exception handler must be 64-bit too, so we use the 64-bit NaCl | 1009 // exception handler must be 64-bit too, so we use the 64-bit NaCl |
| 1009 // broker process for this. Otherwise, on a 32-bit system, we use | 1010 // broker process for this. Otherwise, on a 32-bit system, we use |
| 1010 // the 32-bit browser process to run the debug exception handler. | 1011 // the 32-bit browser process to run the debug exception handler. |
| 1011 if (RunningOnWOW64()) { | 1012 if (RunningOnWOW64()) { |
| 1012 return NaClBrokerService::GetInstance()->LaunchDebugExceptionHandler( | 1013 return nacl::NaClBrokerService::GetInstance()->LaunchDebugExceptionHandler( |
| 1013 weak_factory_.GetWeakPtr(), nacl_pid, process_handle, info); | 1014 weak_factory_.GetWeakPtr(), nacl_pid, process_handle, info); |
| 1014 } else { | 1015 } else { |
| 1015 NaClStartDebugExceptionHandlerThread( | 1016 NaClStartDebugExceptionHandlerThread( |
| 1016 process_handle.Take(), info, | 1017 process_handle.Take(), info, |
| 1017 base::MessageLoopProxy::current(), | 1018 base::MessageLoopProxy::current(), |
| 1018 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, | 1019 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, |
| 1019 weak_factory_.GetWeakPtr())); | 1020 weak_factory_.GetWeakPtr())); |
| 1020 return true; | 1021 return true; |
| 1021 } | 1022 } |
| 1022 } | 1023 } |
| 1023 #endif | 1024 #endif |
| 1025 |
| 1026 } // namespace nacl |
| OLD | NEW |