diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2015-03-27 12:22:44 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2015-03-27 12:22:44 +0000 |
commit | 2034ce665ab37c98f894fcc814482521b91768ac (patch) | |
tree | f796e23b55355479987b54ce03a97fb234d57f30 | |
parent | a6e7516ad914816fcaf0865dce0c248022dd0670 (diff) | |
download | bcm5719-llvm-2034ce665ab37c98f894fcc814482521b91768ac.tar.gz bcm5719-llvm-2034ce665ab37c98f894fcc814482521b91768ac.zip |
tsan: don't write to meta shadow unnecessarily
If user does malloc(1<<30), the write to meta shadow
can cause excessive memory consumption.
llvm-svn: 233373
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_sync.cc | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_sync.cc b/compiler-rt/lib/tsan/rtl/tsan_sync.cc index 49c4d15e5e9..4202d30a2e1 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_sync.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_sync.cc @@ -88,11 +88,13 @@ bool MetaMap::FreeRange(ThreadState *thr, uptr pc, uptr p, uptr sz) { end++; for (; meta < end; meta++) { u32 idx = *meta; + if (idx == 0) { + // Note: don't write to meta in this case -- the block can be huge. + continue; + } *meta = 0; - for (;;) { - if (idx == 0) - break; - has_something = true; + has_something = true; + while (idx != 0) { if (idx & kFlagBlock) { block_alloc_.Free(&thr->block_cache, idx & ~kFlagMask); break; |