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 "components/nacl/browser/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 |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
422 // We'll make sure this actually finished in StartWithLaunchedProcess, below. | 422 // We'll make sure this actually finished in StartWithLaunchedProcess, below. |
423 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); | 423 NaClBrowser* nacl_browser = NaClBrowser::GetInstance(); |
424 nacl_browser->EnsureAllResourcesAvailable(); | 424 nacl_browser->EnsureAllResourcesAvailable(); |
425 if (!nacl_browser->IsOk()) { | 425 if (!nacl_browser->IsOk()) { |
426 SendErrorToRenderer("could not find all the resources needed" | 426 SendErrorToRenderer("could not find all the resources needed" |
427 " to launch the process"); | 427 " to launch the process"); |
428 delete this; | 428 delete this; |
429 return; | 429 return; |
430 } | 430 } |
431 | 431 |
432 if (uses_nonsfi_mode_) { | |
433 #if defined(OS_LINUX) | |
434 const bool kNonSFIModeSupported = true; | |
435 #else | |
436 const bool kNonSFIModeSupported = false; | |
437 #endif | |
438 if (!kNonSFIModeSupported || | |
439 !cmd->HasSwitch(switches::kEnableNaClNonSfiMode)) { | |
440 SendErrorToRenderer("NaCl non-SFI mode works only on Linux with" | |
441 " --enable-nacl-nonsfi-mode specified"); | |
442 delete this; | |
443 return; | |
444 } | |
445 } | |
446 | |
432 // Rather than creating a socket pair in the renderer, and passing | 447 // Rather than creating a socket pair in the renderer, and passing |
433 // one side through the browser to sel_ldr, socket pairs are created | 448 // one side through the browser to sel_ldr, socket pairs are created |
434 // in the browser and then passed to the renderer and sel_ldr. | 449 // in the browser and then passed to the renderer and sel_ldr. |
435 // | 450 // |
436 // This is mainly for the benefit of Windows, where sockets cannot | 451 // This is mainly for the benefit of Windows, where sockets cannot |
437 // be passed in messages, but are copied via DuplicateHandle(). | 452 // be passed in messages, but are copied via DuplicateHandle(). |
438 // This means the sandboxed renderer cannot send handles to the | 453 // This means the sandboxed renderer cannot send handles to the |
439 // browser process. | 454 // browser process. |
440 | 455 |
441 NaClHandle pair[2]; | 456 NaClHandle pair[2]; |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
585 env->SetVar(kPath, new_path); | 600 env->SetVar(kPath, new_path); |
586 } | 601 } |
587 #endif // _DLL | 602 #endif // _DLL |
588 } | 603 } |
589 #endif | 604 #endif |
590 | 605 |
591 scoped_ptr<CommandLine> cmd_line(new CommandLine(exe_path)); | 606 scoped_ptr<CommandLine> cmd_line(new CommandLine(exe_path)); |
592 CopyNaClCommandLineArguments(cmd_line.get()); | 607 CopyNaClCommandLineArguments(cmd_line.get()); |
593 | 608 |
594 cmd_line->AppendSwitchASCII(switches::kProcessType, | 609 cmd_line->AppendSwitchASCII(switches::kProcessType, |
610 uses_nonsfi_mode_ ? | |
611 switches::kNaClLoaderNonSfiProcess : | |
hidehiko
2014/03/31 18:56:17
nit: indent?
Mark Seaborn
2014/03/31 19:35:56
Or '()' brackets, i.e.
foo(blah,
(blah ?
hamaji
2014/04/01 06:53:09
Done.
| |
595 switches::kNaClLoaderProcess); | 612 switches::kNaClLoaderProcess); |
596 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); | 613 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); |
597 if (NaClBrowser::GetDelegate()->DialogsAreSuppressed()) | 614 if (NaClBrowser::GetDelegate()->DialogsAreSuppressed()) |
598 cmd_line->AppendSwitch(switches::kNoErrorDialogs); | 615 cmd_line->AppendSwitch(switches::kNoErrorDialogs); |
599 | 616 |
600 // On Windows we might need to start the broker process to launch a new loader | 617 // On Windows we might need to start the broker process to launch a new loader |
601 #if defined(OS_WIN) | 618 #if defined(OS_WIN) |
602 if (RunningOnWOW64()) { | 619 if (RunningOnWOW64()) { |
603 if (!NaClBrokerService::GetInstance()->LaunchLoader( | 620 if (!NaClBrokerService::GetInstance()->LaunchLoader( |
604 weak_factory_.GetWeakPtr(), channel_id)) { | 621 weak_factory_.GetWeakPtr(), channel_id)) { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
770 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); | 787 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); |
771 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); | 788 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); |
772 params.version = NaClBrowser::GetDelegate()->GetVersionString(); | 789 params.version = NaClBrowser::GetDelegate()->GetVersionString(); |
773 params.enable_exception_handling = enable_exception_handling_; | 790 params.enable_exception_handling = enable_exception_handling_; |
774 params.enable_debug_stub = enable_debug_stub_ && | 791 params.enable_debug_stub = enable_debug_stub_ && |
775 NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(manifest_url_); | 792 NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(manifest_url_); |
776 // Enable PPAPI proxy channel creation only for renderer processes. | 793 // Enable PPAPI proxy channel creation only for renderer processes. |
777 params.enable_ipc_proxy = enable_ppapi_proxy(); | 794 params.enable_ipc_proxy = enable_ppapi_proxy(); |
778 params.uses_irt = uses_irt_; | 795 params.uses_irt = uses_irt_; |
779 params.enable_dyncode_syscalls = enable_dyncode_syscalls_; | 796 params.enable_dyncode_syscalls = enable_dyncode_syscalls_; |
780 params.uses_nonsfi_mode = uses_nonsfi_mode_; | |
781 | 797 |
782 const ChildProcessData& data = process_->GetData(); | 798 const ChildProcessData& data = process_->GetData(); |
783 if (!ShareHandleToSelLdr(data.handle, | 799 if (!ShareHandleToSelLdr(data.handle, |
784 internal_->socket_for_sel_ldr, true, | 800 internal_->socket_for_sel_ldr, true, |
785 ¶ms.handles)) { | 801 ¶ms.handles)) { |
786 return false; | 802 return false; |
787 } | 803 } |
788 | 804 |
789 if (params.uses_irt) { | 805 if (params.uses_irt) { |
790 base::PlatformFile irt_file = nacl_browser->IrtFile(); | 806 base::PlatformFile irt_file = nacl_browser->IrtFile(); |
(...skipping 29 matching lines...) Expand all Loading... | |
820 #if defined(OS_POSIX) | 836 #if defined(OS_POSIX) |
821 if (params.enable_debug_stub) { | 837 if (params.enable_debug_stub) { |
822 net::SocketDescriptor server_bound_socket = GetDebugStubSocketHandle(); | 838 net::SocketDescriptor server_bound_socket = GetDebugStubSocketHandle(); |
823 if (server_bound_socket != net::kInvalidSocket) { | 839 if (server_bound_socket != net::kInvalidSocket) { |
824 params.debug_stub_server_bound_socket = | 840 params.debug_stub_server_bound_socket = |
825 FileDescriptor(server_bound_socket, true); | 841 FileDescriptor(server_bound_socket, true); |
826 } | 842 } |
827 } | 843 } |
828 #endif | 844 #endif |
829 | 845 |
830 if (params.uses_nonsfi_mode) { | |
831 #if defined(OS_LINUX) | |
832 const bool kNonSFIModeSupported = true; | |
833 #else | |
834 const bool kNonSFIModeSupported = false; | |
835 #endif | |
836 if (!kNonSFIModeSupported || | |
837 !CommandLine::ForCurrentProcess()->HasSwitch( | |
838 switches::kEnableNaClNonSfiMode)) { | |
839 return false; | |
840 } | |
841 } | |
842 | |
843 process_->Send(new NaClProcessMsg_Start(params)); | 846 process_->Send(new NaClProcessMsg_Start(params)); |
844 | 847 |
845 internal_->socket_for_sel_ldr = NACL_INVALID_HANDLE; | 848 internal_->socket_for_sel_ldr = NACL_INVALID_HANDLE; |
846 return true; | 849 return true; |
847 } | 850 } |
848 | 851 |
849 // This method is called when NaClProcessHostMsg_PpapiChannelCreated is | 852 // This method is called when NaClProcessHostMsg_PpapiChannelCreated is |
850 // received. | 853 // received. |
851 void NaClProcessHost::OnPpapiChannelsCreated( | 854 void NaClProcessHost::OnPpapiChannelsCreated( |
852 const IPC::ChannelHandle& browser_channel_handle, | 855 const IPC::ChannelHandle& browser_channel_handle, |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1081 process_handle.Take(), info, | 1084 process_handle.Take(), info, |
1082 base::MessageLoopProxy::current(), | 1085 base::MessageLoopProxy::current(), |
1083 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, | 1086 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, |
1084 weak_factory_.GetWeakPtr())); | 1087 weak_factory_.GetWeakPtr())); |
1085 return true; | 1088 return true; |
1086 } | 1089 } |
1087 } | 1090 } |
1088 #endif | 1091 #endif |
1089 | 1092 |
1090 } // namespace nacl | 1093 } // namespace nacl |
OLD | NEW |