1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/public/common/sandbox_init.h" 6 7#include "base/command_line.h" 8#include "base/files/file_path.h" 9#include "base/logging.h" 10#include "content/common/sandbox_mac.h" 11#include "content/public/common/content_switches.h" 12 13namespace content { 14 15bool InitializeSandbox(int sandbox_type, const base::FilePath& allowed_dir) { 16 // Warm up APIs before turning on the sandbox. 17 Sandbox::SandboxWarmup(sandbox_type); 18 19 // Actually sandbox the process. 20 return Sandbox::EnableSandbox(sandbox_type, allowed_dir); 21} 22 23// Fill in |sandbox_type| and |allowed_dir| based on the command line, returns 24// false if the current process type doesn't need to be sandboxed or if the 25// sandbox was disabled from the command line. 26bool GetSandboxTypeFromCommandLine(int* sandbox_type, 27 base::FilePath* allowed_dir) { 28 DCHECK(sandbox_type); 29 DCHECK(allowed_dir); 30 31 *sandbox_type = -1; 32 *allowed_dir = base::FilePath(); // Empty by default. 33 34 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 35 if (command_line.HasSwitch(switches::kNoSandbox)) 36 return false; 37 38 std::string process_type = 39 command_line.GetSwitchValueASCII(switches::kProcessType); 40 if (process_type.empty()) { 41 // Browser process isn't sandboxed. 42 return false; 43 } else if (process_type == switches::kRendererProcess) { 44 *sandbox_type = SANDBOX_TYPE_RENDERER; 45 } else if (process_type == switches::kUtilityProcess) { 46 // Utility process sandbox. 47 *sandbox_type = SANDBOX_TYPE_UTILITY; 48 *allowed_dir = 49 command_line.GetSwitchValuePath(switches::kUtilityProcessAllowedDir); 50 } else if (process_type == switches::kWorkerProcess) { 51 // Worker process sandbox. 52 *sandbox_type = SANDBOX_TYPE_WORKER; 53 } else if (process_type == switches::kGpuProcess) { 54 if (command_line.HasSwitch(switches::kDisableGpuSandbox)) 55 return false; 56 *sandbox_type = SANDBOX_TYPE_GPU; 57 } else if ((process_type == switches::kPluginProcess) || 58 (process_type == switches::kPpapiBrokerProcess)) { 59 return false; 60 } else if (process_type == switches::kPpapiPluginProcess) { 61 *sandbox_type = SANDBOX_TYPE_PPAPI; 62 } else { 63 // This is a process which we don't know about, i.e. an embedder-defined 64 // process. If the embedder wants it sandboxed, they have a chance to return 65 // the sandbox profile in ContentClient::GetSandboxProfileForSandboxType. 66 return false; 67 } 68 return true; 69} 70 71bool InitializeSandbox() { 72 int sandbox_type = 0; 73 base::FilePath allowed_dir; 74 if (!GetSandboxTypeFromCommandLine(&sandbox_type, &allowed_dir)) 75 return true; 76 return InitializeSandbox(sandbox_type, allowed_dir); 77} 78 79} // namespace content 80