summaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_sync.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-03-12 12:48:19 +0000
committerDmitry Vyukov <dvyukov@google.com>2015-03-12 12:48:19 +0000
commit374bd283863aa41ae3c25fabe41c83b6cd480f43 (patch)
treed08429a116b755cded2c7a4428e9c373a09fbdec /lib/tsan/rtl/tsan_sync.cc
parentd4b4e020b0e178677f2d3310cc3ea1c502cbba73 (diff)
tsan: fix a bug in MetaMap::ResetRange
The bug was uncovered by NegativeTests.MmapTest from data-race-test suite, so port it as well. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@232032 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_sync.cc')
-rw-r--r--lib/tsan/rtl/tsan_sync.cc6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/tsan/rtl/tsan_sync.cc b/lib/tsan/rtl/tsan_sync.cc
index 3d2463353..49c4d15e5 100644
--- a/lib/tsan/rtl/tsan_sync.cc
+++ b/lib/tsan/rtl/tsan_sync.cc
@@ -162,8 +162,10 @@ void MetaMap::ResetRange(ThreadState *thr, uptr pc, uptr p, uptr sz) {
// freed). Note: we can't simply madvise, because we need to leave a zeroed
// range (otherwise __tsan_java_move can crash if it encounters a left-over
// meta objects in java heap).
- UnmapOrDie((void*)p0, sz0);
- MmapFixedNoReserve(p0, sz0);
+ uptr metap = (uptr)MemToMeta(p0);
+ uptr metasz = sz0 / kMetaRatio;
+ UnmapOrDie((void*)metap, metasz);
+ MmapFixedNoReserve(metap, metasz);
}
MBlock* MetaMap::GetBlock(uptr p) {