Chromium Code Reviews| 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 "content/common/sandbox_win.h" | 5 #include "content/common/sandbox_win.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/debug/debugger.h" | 11 #include "base/debug/debugger.h" |
| 12 #include "base/debug/profiler.h" | 12 #include "base/debug/profiler.h" |
| 13 #include "base/debug/trace_event.h" | 13 #include "base/debug/trace_event.h" |
| 14 #include "base/file_util.h" | 14 #include "base/file_util.h" |
| 15 #include "base/hash.h" | 15 #include "base/hash.h" |
| 16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
| 17 #include "base/process/launch.h" | 17 #include "base/process/launch.h" |
| 18 #include "base/strings/string_split.h" | |
| 18 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
| 19 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
| 21 #include "base/strings/utf_string_conversions.h" | |
| 20 #include "base/win/iat_patch_function.h" | 22 #include "base/win/iat_patch_function.h" |
| 21 #include "base/win/scoped_handle.h" | 23 #include "base/win/scoped_handle.h" |
| 22 #include "base/win/scoped_process_information.h" | 24 #include "base/win/scoped_process_information.h" |
| 23 #include "base/win/windows_version.h" | 25 #include "base/win/windows_version.h" |
| 24 #include "content/public/common/content_client.h" | 26 #include "content/public/common/content_client.h" |
| 25 #include "content/public/common/content_switches.h" | 27 #include "content/public/common/content_switches.h" |
| 26 #include "content/public/common/sandbox_init.h" | 28 #include "content/public/common/sandbox_init.h" |
| 27 #include "content/public/common/sandboxed_process_launcher_delegate.h" | 29 #include "content/public/common/sandboxed_process_launcher_delegate.h" |
| 28 #include "ipc/ipc_switches.h" | 30 #include "ipc/ipc_switches.h" |
| 29 #include "sandbox/win/src/process_mitigations.h" | 31 #include "sandbox/win/src/process_mitigations.h" |
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 bool ShouldUseDirectWrite() { | 576 bool ShouldUseDirectWrite() { |
| 575 // If the flag is currently on, and we're on Win7 or above, we enable | 577 // If the flag is currently on, and we're on Win7 or above, we enable |
| 576 // DirectWrite. Skia does not require the additions to DirectWrite in QFE | 578 // DirectWrite. Skia does not require the additions to DirectWrite in QFE |
| 577 // 2670838, so a Win7 check is sufficient. We do not currently attempt to | 579 // 2670838, so a Win7 check is sufficient. We do not currently attempt to |
| 578 // support Vista, where SP2 and the Platform Update are required. | 580 // support Vista, where SP2 and the Platform Update are required. |
| 579 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 581 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 580 return command_line.HasSwitch(switches::kEnableDirectWrite) && | 582 return command_line.HasSwitch(switches::kEnableDirectWrite) && |
| 581 base::win::GetVersion() >= base::win::VERSION_WIN7; | 583 base::win::GetVersion() >= base::win::VERSION_WIN7; |
| 582 } | 584 } |
| 583 | 585 |
| 586 bool GetSideloadFontFiles(std::vector<std::string>* files) { | |
| 587 files->clear(); | |
|
jam
2014/04/14 05:40:02
nit: no need for return value and out parameter, j
scottmg
2014/04/14 15:48:58
Done.
| |
| 588 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
| 589 if (command_line.HasSwitch(switches::kRegisterFontFiles)) { | |
| 590 std::vector<std::string> font_files; | |
| 591 base::SplitString( | |
| 592 command_line.GetSwitchValueASCII(switches::kRegisterFontFiles), | |
| 593 ';', | |
| 594 files); | |
| 595 } | |
| 596 return !files->empty(); | |
| 597 } | |
| 598 | |
| 584 base::ProcessHandle StartSandboxedProcess( | 599 base::ProcessHandle StartSandboxedProcess( |
| 585 SandboxedProcessLauncherDelegate* delegate, | 600 SandboxedProcessLauncherDelegate* delegate, |
| 586 CommandLine* cmd_line) { | 601 CommandLine* cmd_line) { |
| 587 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); | 602 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); |
| 588 std::string type_str = cmd_line->GetSwitchValueASCII(switches::kProcessType); | 603 std::string type_str = cmd_line->GetSwitchValueASCII(switches::kProcessType); |
| 589 | 604 |
| 590 TRACE_EVENT_BEGIN_ETW("StartProcessWithAccess", 0, type_str); | 605 TRACE_EVENT_BEGIN_ETW("StartProcessWithAccess", 0, type_str); |
| 591 | 606 |
| 592 bool in_sandbox = true; | 607 bool in_sandbox = true; |
| 593 if (delegate) | 608 if (delegate) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 647 if (!disable_default_policy && !AddPolicyForSandboxedProcess(policy)) | 662 if (!disable_default_policy && !AddPolicyForSandboxedProcess(policy)) |
| 648 return 0; | 663 return 0; |
| 649 | 664 |
| 650 if (type_str == switches::kRendererProcess) { | 665 if (type_str == switches::kRendererProcess) { |
| 651 if (ShouldUseDirectWrite()) { | 666 if (ShouldUseDirectWrite()) { |
| 652 AddDirectory(base::DIR_WINDOWS_FONTS, | 667 AddDirectory(base::DIR_WINDOWS_FONTS, |
| 653 NULL, | 668 NULL, |
| 654 true, | 669 true, |
| 655 sandbox::TargetPolicy::FILES_ALLOW_READONLY, | 670 sandbox::TargetPolicy::FILES_ALLOW_READONLY, |
| 656 policy); | 671 policy); |
| 672 std::vector<std::string> font_files; | |
| 673 if (GetSideloadFontFiles(&font_files)) { | |
| 674 for (std::vector<std::string>::const_iterator i(font_files.begin()); | |
| 675 i != font_files.end(); | |
| 676 ++i) { | |
| 677 policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, | |
| 678 sandbox::TargetPolicy::FILES_ALLOW_READONLY, | |
| 679 base::UTF8ToWide(i->c_str()).c_str()); | |
|
jam
2014/04/14 05:40:02
nit: the first c_str() isn't needed
scottmg
2014/04/14 15:48:58
Done.
| |
| 680 } | |
| 681 } | |
| 657 } | 682 } |
| 658 } else { | 683 } else { |
| 659 // Hack for Google Desktop crash. Trick GD into not injecting its DLL into | 684 // Hack for Google Desktop crash. Trick GD into not injecting its DLL into |
| 660 // this subprocess. See | 685 // this subprocess. See |
| 661 // http://code.google.com/p/chromium/issues/detail?id=25580 | 686 // http://code.google.com/p/chromium/issues/detail?id=25580 |
| 662 cmd_line->AppendSwitchASCII("ignored", " --type=renderer "); | 687 cmd_line->AppendSwitchASCII("ignored", " --type=renderer "); |
| 663 } | 688 } |
| 664 | 689 |
| 665 sandbox::ResultCode result; | 690 sandbox::ResultCode result; |
| 666 if (!exposed_dir.empty()) { | 691 if (!exposed_dir.empty()) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 762 } | 787 } |
| 763 | 788 |
| 764 return false; | 789 return false; |
| 765 } | 790 } |
| 766 | 791 |
| 767 bool BrokerAddTargetPeer(HANDLE peer_process) { | 792 bool BrokerAddTargetPeer(HANDLE peer_process) { |
| 768 return g_broker_services->AddTargetPeer(peer_process) == sandbox::SBOX_ALL_OK; | 793 return g_broker_services->AddTargetPeer(peer_process) == sandbox::SBOX_ALL_OK; |
| 769 } | 794 } |
| 770 | 795 |
| 771 } // namespace content | 796 } // namespace content |
| OLD | NEW |