| // Copyright 2018 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 "base/debug/invalid_access_win.h" | 
 |  | 
 | #include <stdlib.h> | 
 | #include <windows.h> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "base/win/windows_version.h" | 
 | #include "starboard/memory.h" | 
 | #include "starboard/types.h" | 
 |  | 
 | namespace base { | 
 | namespace debug { | 
 | namespace win { | 
 |  | 
 | namespace { | 
 |  | 
 | void CreateSyntheticHeapCorruption() { | 
 |   EXCEPTION_RECORD record = {}; | 
 |   record.ExceptionCode = STATUS_HEAP_CORRUPTION; | 
 |   RaiseFailFastException(&record, nullptr, | 
 |                          FAIL_FAST_GENERATE_EXCEPTION_ADDRESS); | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | void TerminateWithHeapCorruption() { | 
 |   __try { | 
 |     // Pre-Windows 10, it's hard to trigger a heap corruption fast fail, so | 
 |     // artificially create one instead. | 
 |     if (base::win::GetVersion() < base::win::VERSION_WIN10) | 
 |       CreateSyntheticHeapCorruption(); | 
 |     HANDLE heap = ::HeapCreate(0, 0, 0); | 
 |     CHECK(heap); | 
 |     CHECK(HeapSetInformation(heap, HeapEnableTerminationOnCorruption, nullptr, | 
 |                              0)); | 
 |     void* addr = ::HeapAlloc(heap, 0, 0x1000); | 
 |     CHECK(addr); | 
 |     // Corrupt heap header. | 
 |     char* addr_mutable = reinterpret_cast<char*>(addr); | 
 |     memset(addr_mutable - sizeof(addr), 0xCC, sizeof(addr)); | 
 |  | 
 |     HeapFree(heap, 0, addr); | 
 |     HeapDestroy(heap); | 
 |   } __except (EXCEPTION_EXECUTE_HANDLER) { | 
 |     // Heap corruption exception should never be caught. | 
 |     CHECK(false); | 
 |   } | 
 |   // Should never reach here. | 
 |   abort(); | 
 | } | 
 |  | 
 | }  // namespace win | 
 | }  // namespace debug | 
 | }  // namespace base |