Home | History | Annotate | Download | only in app
      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/app/startup_helper_win.h"
      6 
      7 #include <crtdbg.h>
      8 #include <new.h>
      9 
     10 #include "base/base_switches.h"
     11 #include "base/command_line.h"
     12 #include "base/win/windows_version.h"
     13 #include "sandbox/win/src/process_mitigations.h"
     14 #include "sandbox/win/src/sandbox_factory.h"
     15 
     16 namespace {
     17 
     18 #pragma optimize("", off)
     19 // Handlers for invalid parameter and pure call. They generate a breakpoint to
     20 // tell breakpad that it needs to dump the process.
     21 void InvalidParameter(const wchar_t* expression, const wchar_t* function,
     22                       const wchar_t* file, unsigned int line,
     23                       uintptr_t reserved) {
     24   __debugbreak();
     25   _exit(1);
     26 }
     27 
     28 void PureCall() {
     29   __debugbreak();
     30   _exit(1);
     31 }
     32 #pragma optimize("", on)
     33 
     34 }  // namespace
     35 
     36 namespace content {
     37 
     38 void InitializeSandboxInfo(sandbox::SandboxInterfaceInfo* info) {
     39   info->broker_services = sandbox::SandboxFactory::GetBrokerServices();
     40   if (!info->broker_services) {
     41     info->target_services = sandbox::SandboxFactory::GetTargetServices();
     42   } else {
     43     // Ensure the proper mitigations are enforced for the browser process.
     44     sandbox::ApplyProcessMitigationsToCurrentProcess(
     45         sandbox::MITIGATION_DEP |
     46         sandbox::MITIGATION_DEP_NO_ATL_THUNK);
     47   }
     48 }
     49 
     50 // Register the invalid param handler and pure call handler to be able to
     51 // notify breakpad when it happens.
     52 void RegisterInvalidParamHandler() {
     53   _set_invalid_parameter_handler(InvalidParameter);
     54   _set_purecall_handler(PureCall);
     55   // Also enable the new handler for malloc() based failures.
     56   _set_new_mode(1);
     57 }
     58 
     59 void SetupCRT(const base::CommandLine& command_line) {
     60 #if defined(_CRTDBG_MAP_ALLOC)
     61   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
     62   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
     63 #else
     64   if (!command_line.HasSwitch(switches::kDisableBreakpad)) {
     65     _CrtSetReportMode(_CRT_ASSERT, 0);
     66   }
     67 #endif
     68 }
     69 
     70 }  // namespace content
     71