Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: syzygy/agent/asan/heap_managers/block_heap_manager.cc

Issue 2527533003: Make SyzyAsan support the allocation > 1GB (Closed)
Patch Set: Add a maximum allocation size check. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 Google Inc. All Rights Reserved. 1 // Copyright 2014 Google Inc. All Rights Reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 27 matching lines...) Expand all
38 38
39 typedef HeapManagerInterface::HeapId HeapId; 39 typedef HeapManagerInterface::HeapId HeapId;
40 using heaps::LargeBlockHeap; 40 using heaps::LargeBlockHeap;
41 using heaps::ZebraBlockHeap; 41 using heaps::ZebraBlockHeap;
42 42
43 // For now, the overbudget size is always set to 20% of the size of the 43 // For now, the overbudget size is always set to 20% of the size of the
44 // quarantine. 44 // quarantine.
45 // TODO(georgesak): allow this to be changed through the parameters. 45 // TODO(georgesak): allow this to be changed through the parameters.
46 enum : uint32_t { kOverbudgetSizePercentage = 20 }; 46 enum : uint32_t { kOverbudgetSizePercentage = 20 };
47 47
48 // The maximum allocation size that we can handle in SyzyAsan, this is
49 // constrained by the number of bits used to store the block size in the block
50 // header structure.
51 const size_t kMaxAllocSize = 0x8000000;
chrisha 2016/11/23 19:37:17 This should be part of block.h, and tied to a #def
Sébastien Marchand 2016/11/23 22:36:01 I've tried this but it doesn't seem to work, doing
chrisha 2016/11/24 17:23:22 Acknowledged.
52
48 // Return the position of the most significant bit in a 32 bit unsigned value. 53 // Return the position of the most significant bit in a 32 bit unsigned value.
49 size_t GetMSBIndex(size_t n) { 54 size_t GetMSBIndex(size_t n) {
50 // Algorithm taken from 55 // Algorithm taken from
51 // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog 56 // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
52 size_t r = 0; 57 size_t r = 0;
53 size_t shift = 0; 58 size_t shift = 0;
54 r = (n > 0xFFFF) << 4; 59 r = (n > 0xFFFF) << 4;
55 n >>= r; 60 n >>= r;
56 shift = (n > 0xFF) << 3; 61 shift = (n > 0xFF) << 3;
57 n >>= shift; 62 n >>= shift;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 heaps_.erase(heaps_.find(heap)); 174 heaps_.erase(heaps_.find(heap));
170 } 175 }
171 176
172 return true; 177 return true;
173 } 178 }
174 179
175 void* BlockHeapManager::Allocate(HeapId heap_id, uint32_t bytes) { 180 void* BlockHeapManager::Allocate(HeapId heap_id, uint32_t bytes) {
176 DCHECK(initialized_); 181 DCHECK(initialized_);
177 DCHECK(IsValidHeapId(heap_id, false)); 182 DCHECK(IsValidHeapId(heap_id, false));
178 183
184 // Prevent from trying to allocate a memory block bigger than what we can
185 // represent in the block header.
186 if (bytes > kMaxAllocSize)
187 return nullptr;
chrisha 2016/11/23 19:37:17 I'd just push this through to the underlying heap
Sébastien Marchand 2016/11/23 22:36:01 I think that this should live in block.cc::BlockPl
188
179 // Some allocations can pass through without instrumentation. 189 // Some allocations can pass through without instrumentation.
180 if (parameters_.allocation_guard_rate < 1.0 && 190 if (parameters_.allocation_guard_rate < 1.0 &&
181 base::RandDouble() >= parameters_.allocation_guard_rate) { 191 base::RandDouble() >= parameters_.allocation_guard_rate) {
182 BlockHeapInterface* heap = GetHeapFromId(heap_id); 192 BlockHeapInterface* heap = GetHeapFromId(heap_id);
183 void* alloc = heap->Allocate(bytes); 193 void* alloc = heap->Allocate(bytes);
184 if ((heap->GetHeapFeatures() & 194 if ((heap->GetHeapFeatures() &
185 HeapInterface::kHeapReportsReservations) != 0) { 195 HeapInterface::kHeapReportsReservations) != 0) {
186 shadow_->Unpoison(alloc, bytes); 196 shadow_->Unpoison(alloc, bytes);
187 } 197 }
188 return alloc; 198 return alloc;
(...skipping 29 matching lines...) Expand all
218 alloc = heap->AllocateBlock( 228 alloc = heap->AllocateBlock(
219 bytes, 229 bytes,
220 0, 230 0,
221 parameters_.trailer_padding_size + sizeof(BlockTrailer), 231 parameters_.trailer_padding_size + sizeof(BlockTrailer),
222 &block_layout); 232 &block_layout);
223 if (alloc != nullptr) { 233 if (alloc != nullptr) {
224 heap_id = heaps[i]; 234 heap_id = heaps[i];
225 break; 235 break;
226 } 236 }
227 } 237 }
228 238
chrisha 2016/11/24 17:23:22 If you're moving the logic to BlockPlanLayout, we
Sébastien Marchand 2016/11/25 02:38:21 Done.
229 // The allocation can fail if we're out of memory. 239 // The allocation can fail if we're out of memory.
230 if (alloc == nullptr) 240 if (alloc == nullptr)
231 return nullptr; 241 return nullptr;
232 242
233 DCHECK_NE(static_cast<void*>(nullptr), alloc); 243 DCHECK_NE(static_cast<void*>(nullptr), alloc);
234 DCHECK_EQ(0u, reinterpret_cast<size_t>(alloc) % kShadowRatio); 244 DCHECK_EQ(0u, reinterpret_cast<size_t>(alloc) % kShadowRatio);
235 BlockInfo block = {}; 245 BlockInfo block = {};
236 BlockInitialize(block_layout, alloc, &block); 246 BlockInitialize(block_layout, alloc, &block);
237 247
238 // Poison the redzones in the shadow memory as early as possible. 248 // Poison the redzones in the shadow memory as early as possible.
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 if (trailer_has_valid_heap_id) 1122 if (trailer_has_valid_heap_id)
1113 return block_info->trailer->heap_id; 1123 return block_info->trailer->heap_id;
1114 1124
1115 // Unfortunately, there's no way to know which heap this block belongs to. 1125 // Unfortunately, there's no way to know which heap this block belongs to.
1116 return 0; 1126 return 0;
1117 } 1127 }
1118 1128
1119 } // namespace heap_managers 1129 } // namespace heap_managers
1120 } // namespace asan 1130 } // namespace asan
1121 } // namespace agent 1131 } // namespace agent
OLDNEW
« no previous file with comments | « syzygy/agent/asan/error_info_unittest.cc ('k') | syzygy/agent/asan/heap_managers/block_heap_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698