15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/debug/leak_annotations.h" 79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/hi_res_timer_manager.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_process.h" 11d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "content/common/sandbox_linux/sandbox_linux.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/main_function_params.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/sandbox_init.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/utility/utility_thread_impl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(TOOLKIT_GTK) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <gtk/gtk.h> 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/gtk_util.h" 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mainline routine for running as the utility process. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UtilityMain(const MainFunctionParams& parameters) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The main message loop of the utility process. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop main_message_loop; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::SetName("CrUtilityMain"); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Initializes the sandbox before any threads are created. 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // TODO(jorgelo): move this after GTK initialization when we enable a strict 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Seccomp-BPF policy. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LinuxSandbox::InitializeSandbox(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_POSIX) 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The utility process is used to load plugins (see OnLoadPlugins() in 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // utility_thread_impl.cc). Some plugins expect the browser to have loaded 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // GLib/GTK. 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Due to bugs in GLib we need to initialize GLib/GTK before we start threads, 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // see crbug.com/309093. 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(TOOLKIT_GTK) 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_sandboxed = false; 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // On Linux, we only initialize GLib/GTK if we're not sandboxed. 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) is_sandboxed = !parameters.command_line.HasSwitch(switches::kNoSandbox); 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!is_sandboxed) { 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // g_thread_init() is deprecated since glib 2.31.0, please see release note: 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // http://mail.gnome.org/archives/gnome-announce-list/2011-October/msg00041.html 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !(GLIB_CHECK_VERSION(2, 31, 0)) 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!g_thread_get_initialized()) { 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) g_thread_init(NULL); 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess()); 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcess utility_process; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utility_process.set_main_thread(new UtilityThreadImpl()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HighResolutionTimerManager hi_res_timer_manager; 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool no_sandbox = parameters.command_line.HasSwitch(switches::kNoSandbox); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!no_sandbox) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sandbox::TargetServices* target_services = 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parameters.sandbox_info->target_services; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target_services) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_services->LowerToken(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Run(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(LEAK_SANITIZER) 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Invoke LeakSanitizer before shutting down the utility thread, to avoid 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // reporting shutdown-only leaks. 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) __lsan_do_leak_check(); 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 98