// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/common/terminate_on_heap_corruption_experiment_win.h" #include "base/command_line.h" #include "base/metrics/field_trial.h" #include "base/win/registry.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_version_info.h" namespace { const wchar_t* GetBeaconKeyPath() { chrome::VersionInfo::Channel channel = chrome::VersionInfo::CHANNEL_UNKNOWN; // We are called quite early, before the CommandLine is initialized. We don't // want to permanently initialize it because ContentMainRunner::Initialize // sets some locale-related stuff to make sure it is parsed properly. But we // can temporarily initialize it for the purpose of determining if we are // Canary. if (!CommandLine::InitializedForCurrentProcess()) { CommandLine::Init(0, NULL); channel = chrome::VersionInfo::GetChannel(); CommandLine::Reset(); } else { channel = chrome::VersionInfo::GetChannel(); } if (channel == chrome::VersionInfo::CHANNEL_CANARY) { return L"SOFTWARE\\" PRODUCT_STRING_PATH L"\\DisableTerminateOnProcessHeapCorruptionSxs"; } return L"SOFTWARE\\" PRODUCT_STRING_PATH L"\\DisableTerminateOnProcessHeapCorruption"; } } // namespace bool ShouldExperimentallyDisableTerminateOnHeapCorruption() { base::win::RegKey regkey( HKEY_CURRENT_USER, GetBeaconKeyPath(), KEY_QUERY_VALUE); return regkey.Valid(); } void InitializeDisableTerminateOnHeapCorruptionExperiment() { base::win::RegKey regkey(HKEY_CURRENT_USER); if (base::FieldTrialList::FindFullName("TerminateOnProcessHeapCorruption") == "Disabled") { regkey.CreateKey(GetBeaconKeyPath(), KEY_SET_VALUE); } else { regkey.DeleteKey(GetBeaconKeyPath()); } }