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