[llvm-commits] [compiler-rt] r172395 - /compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator.h
Dmitry Vyukov
dvyukov at google.com
Mon Jan 14 02:49:11 PST 2013
Author: dvyukov
Date: Mon Jan 14 04:49:11 2013
New Revision: 172395
URL: http://llvm.org/viewvc/llvm-project?rev=172395&view=rev
Log:
asan/tsan: mmap shadow memory before allocating memory (otherwise other threads can access non yet allocated shadow)
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator.h
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator.h?rev=172395&r1=172394&r2=172395&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator.h Mon Jan 14 04:49:11 2013
@@ -389,22 +389,9 @@
MapWithCallback(region_beg + region->mapped_user, map_size);
region->mapped_user += map_size;
}
- for (;;) {
- if (class_id < SizeClassMap::kMinBatchClass)
- b = (Batch*)c->Allocate(this, SizeClassMap::ClassID(sizeof(Batch)));
- else
- b = (Batch*)(region_beg + beg_idx);
- b->count = count;
- for (uptr i = 0; i < count; i++)
- b->batch[i] = (void*)(region_beg + beg_idx + i * size);
- region->allocated_user += count * size;
- CHECK_LE(region->allocated_user, region->mapped_user);
- region->allocated_meta += count * kMetadataSize;
- beg_idx += count * size;
- if (beg_idx + count * size + size > region->mapped_user)
- break;
- region->free_list.Push(b);
- }
+ uptr total_count = (region->mapped_user - beg_idx - size)
+ / size / count * count;
+ region->allocated_meta += total_count * kMetadataSize;
if (region->allocated_meta > region->mapped_meta) {
uptr map_size = kMetaMapSize;
while (region->allocated_meta > region->mapped_meta + map_size)
@@ -422,6 +409,21 @@
kRegionSize / 1024 / 1024, size);
Die();
}
+ for (;;) {
+ if (class_id < SizeClassMap::kMinBatchClass)
+ b = (Batch*)c->Allocate(this, SizeClassMap::ClassID(sizeof(Batch)));
+ else
+ b = (Batch*)(region_beg + beg_idx);
+ b->count = count;
+ for (uptr i = 0; i < count; i++)
+ b->batch[i] = (void*)(region_beg + beg_idx + i * size);
+ region->allocated_user += count * size;
+ CHECK_LE(region->allocated_user, region->mapped_user);
+ beg_idx += count * size;
+ if (beg_idx + count * size + size > region->mapped_user)
+ break;
+ region->free_list.Push(b);
+ }
return b;
}
};
More information about the llvm-commits
mailing list