| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #define _CRT_SECURE_NO_WARNINGS | 5 #define _CRT_SECURE_NO_WARNINGS |
| 6 | 6 |
| 7 #include "base/process/memory.h" | 7 #include "base/process/memory.h" |
| 8 | 8 |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 | 10 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 const_cast<int*>(&kConstantInModule))); | 60 const_cast<int*>(&kConstantInModule))); |
| 61 | 61 |
| 62 // Any address within the kernel32 module should return | 62 // Any address within the kernel32 module should return |
| 63 // kernel32's HMODULE. Our only assumption here is that | 63 // kernel32's HMODULE. Our only assumption here is that |
| 64 // kernel32 is larger than 4 bytes. | 64 // kernel32 is larger than 4 bytes. |
| 65 HMODULE kernel32 = ::GetModuleHandle(L"kernel32.dll"); | 65 HMODULE kernel32 = ::GetModuleHandle(L"kernel32.dll"); |
| 66 HMODULE kernel32_from_address = | 66 HMODULE kernel32_from_address = |
| 67 base::GetModuleFromAddress(reinterpret_cast<DWORD*>(kernel32) + 1); | 67 base::GetModuleFromAddress(reinterpret_cast<DWORD*>(kernel32) + 1); |
| 68 EXPECT_EQ(kernel32, kernel32_from_address); | 68 EXPECT_EQ(kernel32, kernel32_from_address); |
| 69 } | 69 } |
| 70 | |
| 71 TEST(ProcessMemoryTest, EnableLFH) { | |
| 72 ASSERT_TRUE(base::EnableLowFragmentationHeap()); | |
| 73 if (IsDebuggerPresent()) { | |
| 74 // Under these conditions, LFH can't be enabled. There's no point to test | |
| 75 // anything. | |
| 76 const char* no_debug_env = getenv("_NO_DEBUG_HEAP"); | |
| 77 if (!no_debug_env || strcmp(no_debug_env, "1")) | |
| 78 return; | |
| 79 } | |
| 80 HMODULE kernel32 = GetModuleHandle(L"kernel32.dll"); | |
| 81 ASSERT_TRUE(kernel32 != NULL); | |
| 82 HeapQueryFn heap_query = reinterpret_cast<HeapQueryFn>(GetProcAddress( | |
| 83 kernel32, | |
| 84 "HeapQueryInformation")); | |
| 85 | |
| 86 // On Windows 2000, the function is not exported. This is not a reason to | |
| 87 // fail but we won't be able to retrieves information about the heap, so we | |
| 88 // should stop here. | |
| 89 if (heap_query == NULL) | |
| 90 return; | |
| 91 | |
| 92 HANDLE heaps[1024] = { 0 }; | |
| 93 unsigned number_heaps = GetProcessHeaps(1024, heaps); | |
| 94 EXPECT_GT(number_heaps, 0u); | |
| 95 for (unsigned i = 0; i < number_heaps; ++i) { | |
| 96 ULONG flag = 0; | |
| 97 SIZE_T length; | |
| 98 ASSERT_NE(0, heap_query(heaps[i], | |
| 99 HeapCompatibilityInformation, | |
| 100 &flag, | |
| 101 sizeof(flag), | |
| 102 &length)); | |
| 103 // If flag is 0, the heap is a standard heap that does not support | |
| 104 // look-asides. If flag is 1, the heap supports look-asides. If flag is 2, | |
| 105 // the heap is a low-fragmentation heap (LFH). Note that look-asides are not | |
| 106 // supported on the LFH. | |
| 107 | |
| 108 // We don't have any documented way of querying the HEAP_NO_SERIALIZE flag. | |
| 109 EXPECT_LE(flag, 2u); | |
| 110 EXPECT_NE(flag, 1u); | |
| 111 } | |
| 112 } | |
| 113 #endif // defined(OS_WIN) | 70 #endif // defined(OS_WIN) |
| 114 | 71 |
| 115 #if defined(OS_MACOSX) | 72 #if defined(OS_MACOSX) |
| 116 | 73 |
| 117 // For the following Mac tests: | 74 // For the following Mac tests: |
| 118 // Note that base::EnableTerminationOnHeapCorruption() is called as part of | 75 // Note that base::EnableTerminationOnHeapCorruption() is called as part of |
| 119 // test suite setup and does not need to be done again, else mach_override | 76 // test suite setup and does not need to be done again, else mach_override |
| 120 // will fail. | 77 // will fail. |
| 121 | 78 |
| 122 TEST(ProcessMemoryTest, MacTerminateOnHeapCorruption) { | 79 TEST(ProcessMemoryTest, MacTerminateOnHeapCorruption) { |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 for (size_t i = 0; i < (kSafeCallocItems * kSafeCallocSize); ++i) | 426 for (size_t i = 0; i < (kSafeCallocItems * kSafeCallocSize); ++i) |
| 470 EXPECT_EQ(0, bytes[i]); | 427 EXPECT_EQ(0, bytes[i]); |
| 471 free(value_); | 428 free(value_); |
| 472 | 429 |
| 473 EXPECT_FALSE(base::UncheckedCalloc(1, test_size_, &value_)); | 430 EXPECT_FALSE(base::UncheckedCalloc(1, test_size_, &value_)); |
| 474 EXPECT_TRUE(value_ == NULL); | 431 EXPECT_TRUE(value_ == NULL); |
| 475 } | 432 } |
| 476 #endif // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) | 433 #endif // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) |
| 477 #endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && !(defined(OS_WIN) && | 434 #endif // !defined(OS_ANDROID) && !defined(OS_OPENBSD) && !(defined(OS_WIN) && |
| 478 // !defined(ALLOCATOR_SHIM)) && !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) | 435 // !defined(ALLOCATOR_SHIM)) && !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) |
| OLD | NEW |