1// Copyright 2014 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 "chrome/common/terminate_on_heap_corruption_experiment_win.h"
6
7#include "base/command_line.h"
8#include "base/metrics/field_trial.h"
9#include "base/win/registry.h"
10#include "chrome/common/chrome_constants.h"
11#include "chrome/common/chrome_version_info.h"
12
13namespace {
14
15const wchar_t* GetBeaconKeyPath() {
16  chrome::VersionInfo::Channel channel = chrome::VersionInfo::CHANNEL_UNKNOWN;
17
18  // We are called quite early, before the CommandLine is initialized. We don't
19  // want to permanently initialize it because ContentMainRunner::Initialize
20  // sets some locale-related stuff to make sure it is parsed properly. But we
21  // can temporarily initialize it for the purpose of determining if we are
22  // Canary.
23  if (!CommandLine::InitializedForCurrentProcess()) {
24    CommandLine::Init(0, NULL);
25    channel = chrome::VersionInfo::GetChannel();
26    CommandLine::Reset();
27  } else {
28    channel = chrome::VersionInfo::GetChannel();
29  }
30
31  if (channel == chrome::VersionInfo::CHANNEL_CANARY) {
32    return L"SOFTWARE\\" PRODUCT_STRING_PATH
33        L"\\DisableTerminateOnProcessHeapCorruptionSxs";
34  }
35  return L"SOFTWARE\\" PRODUCT_STRING_PATH
36      L"\\DisableTerminateOnProcessHeapCorruption";
37}
38
39}  // namespace
40
41bool ShouldExperimentallyDisableTerminateOnHeapCorruption() {
42  base::win::RegKey regkey(
43      HKEY_CURRENT_USER, GetBeaconKeyPath(), KEY_QUERY_VALUE);
44  return regkey.Valid();
45}
46
47void InitializeDisableTerminateOnHeapCorruptionExperiment() {
48  base::win::RegKey regkey(HKEY_CURRENT_USER);
49
50  if (base::FieldTrialList::FindFullName("TerminateOnProcessHeapCorruption") ==
51      "Disabled") {
52    regkey.CreateKey(GetBeaconKeyPath(), KEY_SET_VALUE);
53  } else {
54    regkey.DeleteKey(GetBeaconKeyPath());
55  }
56}
57