Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
|
Sébastien Marchand
2017/07/25 16:21:53
2017
njanevsk
2017/07/25 17:43:02
Done.
| |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // This header defines symbols to override the same functions in the Visual C++ | |
|
Sébastien Marchand
2017/07/25 16:21:53
This isn't a header :)
njanevsk
2017/07/25 17:43:01
Done.
| |
| 6 // CRT implementation. | |
| 7 | |
| 8 #ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_UCRT_SYMBOLS_WIN_H_ | |
| 9 #error This header is meant to be included only once by allocator_shim.cc | |
|
Sébastien Marchand
2017/07/25 16:21:53
We don't need this anymore.
njanevsk
2017/07/25 17:43:02
Done.
| |
| 10 #endif | |
| 11 #define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_UCRT_SYMBOLS_WIN_H_ | |
| 12 | |
| 13 #include <windows.h> | |
| 14 #include <malloc.h> | |
| 15 #include <mutex> | |
| 16 #include "base/logging.h" | |
|
Sébastien Marchand
2017/07/25 16:21:53
Do you really need logging?
njanevsk
2017/07/25 19:49:17
Done.
| |
| 17 | |
| 18 extern "C" { | |
| 19 | |
| 20 namespace { | |
| 21 | |
| 22 typedef HANDLE(WINAPI* HeapCreatePtr)(DWORD, SIZE_T, SIZE_T); | |
|
Sébastien Marchand
2017/07/25 16:21:53
Add a comment to describe what these typedefs are.
njanevsk
2017/07/25 17:43:02
Done.
| |
| 23 typedef BOOL(WINAPI* HeapDestroyPtr)(HANDLE); | |
| 24 typedef LPVOID(WINAPI* HeapAllocPtr)(HANDLE, DWORD, SIZE_T); | |
| 25 typedef LPVOID(WINAPI* HeapReAllocPtr)(HANDLE, DWORD, LPVOID, SIZE_T); | |
| 26 typedef BOOL(WINAPI* HeapFreePtr)(HANDLE, DWORD, LPVOID); | |
| 27 | |
| 28 int win_new_mode = 0; | |
|
Sébastien Marchand
2017/07/25 16:21:53
You don't need this.
njanevsk
2017/07/25 17:43:01
Done.
| |
| 29 std::mutex m; | |
|
Sébastien Marchand
2017/07/25 16:21:53
Rename this to something more meaningful, add a co
njanevsk
2017/07/25 17:43:02
Done.
| |
| 30 | |
|
Sébastien Marchand
2017/07/25 16:21:52
Remove one of these BLs
njanevsk
2017/07/25 17:43:01
Done.
| |
| 31 | |
| 32 struct asan_shim_struct { | |
|
Sébastien Marchand
2017/07/25 16:21:53
Use a CamelCase name.
njanevsk
2017/07/25 17:43:02
Done.
chrisha
2017/07/25 18:47:14
Also, _struct / Struct isn't adding any additional
njanevsk
2017/07/25 19:49:17
I changed it to AsanRuntimePointers. I want to hav
| |
| 33 HANDLE asan_heap = nullptr; | |
| 34 HMODULE asan_module; | |
| 35 HeapCreatePtr heap_create; | |
| 36 HeapAllocPtr heap_alloc; | |
| 37 HeapFreePtr heap_free; | |
| 38 HeapReAllocPtr heap_realloc; | |
|
chrisha
2017/07/25 18:47:14
All of these should have = nullptr as well.
njanevsk
2017/07/25 19:49:17
Done.
| |
| 39 }; | |
| 40 | |
| 41 asan_shim_struct asan_shim; | |
| 42 | |
| 43 void load_asan_module() { | |
| 44 std::unique_lock<std::mutex> lock(m); | |
|
Sébastien Marchand
2017/07/25 16:21:52
I think that we could avoid all this by moving thi
njanevsk
2017/07/25 17:43:02
That sounds like a really good idea. That way the
chrisha
2017/07/25 18:47:14
That means that we rely on the static initializers
njanevsk
2017/07/25 19:49:17
Thanks. I removed the lock. Seb are you satisified
Sébastien Marchand
2017/07/25 20:07:06
Yep, this approach sgtm.
| |
| 45 if (asan_shim.asan_module == nullptr) { | |
| 46 asan_shim.asan_module = GetModuleHandle(L"syzyasan_rtl.dll"); | |
| 47 asan_shim.heap_create = reinterpret_cast<HeapCreatePtr>( | |
| 48 ::GetProcAddress(asan_shim.asan_module, "asan_HeapCreate")); | |
| 49 asan_shim.heap_alloc = reinterpret_cast<HeapAllocPtr>( | |
| 50 ::GetProcAddress(asan_shim.asan_module, "asan_HeapAlloc")); | |
| 51 asan_shim.heap_free = reinterpret_cast<HeapFreePtr>( | |
| 52 ::GetProcAddress(asan_shim.asan_module, "asan_HeapFree")); | |
| 53 asan_shim.heap_realloc = reinterpret_cast<HeapReAllocPtr>( | |
| 54 ::GetProcAddress(asan_shim.asan_module, "asan_HeapReAlloc")); | |
| 55 } | |
| 56 lock.unlock(); | |
| 57 } | |
| 58 | |
| 59 inline HANDLE get_heap_handle() { | |
| 60 load_asan_module(); | |
|
Sébastien Marchand
2017/07/25 16:21:53
put this behind a "if (asan_shim.asan_module == nu
njanevsk
2017/07/25 19:49:17
Since we are getting rid of the lock this is N\A.
| |
| 61 return asan_shim.asan_heap; | |
| 62 } | |
| 63 | |
| 64 } // namespace | |
| 65 | |
| 66 // This function behaves similarly to MSVC's _set_new_mode. | |
| 67 // If flag is 0 (default), calls to malloc will behave normally. | |
| 68 // If flag is 1, calls to malloc will behave like calls to new, | |
| 69 // and the std_new_handler will be invoked on failure. | |
| 70 // Returns the previous mode. | |
| 71 // | |
| 72 // Replaces _set_new_mode in ucrt\heap\new_mode.cpp | |
| 73 int _set_new_mode(int flag) { | |
| 74 return 0; | |
| 75 } | |
| 76 | |
| 77 // Replaces _query_new_mode in ucrt\heap\new_mode.cpp | |
| 78 int _query_new_mode() { | |
| 79 return 0; | |
| 80 } | |
| 81 | |
| 82 // These symbols override the CRT's implementation of the same functions. | |
| 83 __declspec(restrict) void* malloc(size_t size) { | |
| 84 | |
|
Sébastien Marchand
2017/07/25 16:21:53
Remove this BL.
njanevsk
2017/07/25 17:43:02
Done.
| |
| 85 return asan_shim.heap_alloc(get_heap_handle(), 0, size); | |
| 86 } | |
| 87 | |
| 88 void free(void* ptr) { | |
| 89 load_asan_module(); | |
|
Sébastien Marchand
2017/07/25 16:21:52
This is confusing, the load_asan_module is in some
njanevsk
2017/07/25 17:43:02
If we use a constructor for the structure then the
| |
| 90 asan_shim.heap_free(get_heap_handle(), 0, ptr); | |
| 91 } | |
| 92 | |
| 93 __declspec(restrict) void* realloc(void* ptr, size_t size) { | |
| 94 load_asan_module(); | |
| 95 return asan_shim.heap_realloc(get_heap_handle(), 0, ptr, size); | |
| 96 } | |
| 97 | |
| 98 __declspec(restrict) void* calloc(size_t n, size_t size) { | |
| 99 load_asan_module(); | |
| 100 void* ptr = malloc(size * n); | |
| 101 ::memset(ptr, 0, size * n); | |
|
Sébastien Marchand
2017/07/25 16:21:53
Check if ptr == nullptr before this, the malloc ca
njanevsk
2017/07/25 17:43:02
Done.
| |
| 102 return ptr; | |
| 103 } | |
| 104 | |
| 105 // The symbols | |
| 106 // * __acrt_heap | |
| 107 // * __acrt_initialize_heap | |
| 108 // * __acrt_uninitialize_heap | |
| 109 // * _get_heap_handle | |
| 110 // must be overridden all or none, as they are otherwise supplied | |
| 111 // by heap_handle.obj in the ucrt.lib file. | |
| 112 HANDLE __acrt_heap = nullptr; | |
| 113 | |
| 114 bool __acrt_initialize_heap() { | |
| 115 __acrt_heap = ::HeapCreate(0, 0, 0); | |
| 116 return true; | |
| 117 } | |
| 118 | |
| 119 bool __acrt_uninitialize_heap() { | |
| 120 ::HeapDestroy(__acrt_heap); | |
| 121 __acrt_heap = nullptr; | |
| 122 return true; | |
| 123 } | |
| 124 | |
| 125 intptr_t _get_heap_handle(void) { | |
| 126 return reinterpret_cast<intptr_t>(__acrt_heap); | |
| 127 } | |
| 128 | |
| 129 // The default dispatch translation unit has to define also the following | |
|
Sébastien Marchand
2017/07/25 16:21:53
You don't need this comment afaik.
njanevsk
2017/07/25 17:43:02
Done.
| |
| 130 // symbols (unless they are ultimately routed to the system symbols): | |
| 131 // void malloc_stats(void); | |
| 132 // int mallopt(int, int); | |
| 133 // struct mallinfo mallinfo(void); | |
| 134 // size_t malloc_size(void*); | |
| 135 // size_t malloc_usable_size(const void*); | |
| 136 | |
| 137 } // extern "C" | |
| OLD | NEW |