| // 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); |
| SbMemorySet(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 |