Skip to content

Commit 99af99c

Browse files
authored
[TSan] Fix p == end == ShadowMem::end in ShadowSet (#144994)
In `ShadowSet`, when `p == end == ShadowMem::end`, it triggered an assertion fail previously. Now we do not allow `p == end` anymore in `ShadowSet`.
1 parent a961ba8 commit 99af99c

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -523,9 +523,9 @@ ALWAYS_INLINE USED void UnalignedMemoryAccess(ThreadState* thr, uptr pc,
523523
}
524524

525525
void ShadowSet(RawShadow* p, RawShadow* end, RawShadow v) {
526-
DCHECK_LE(p, end);
526+
DCHECK_LT(p, end);
527527
DCHECK(IsShadowMem(p));
528-
DCHECK(p == end || IsShadowMem(end - 1));
528+
DCHECK(IsShadowMem(end - 1));
529529
UNUSED const uptr kAlign = kShadowCnt * kShadowSize;
530530
DCHECK_EQ(reinterpret_cast<uptr>(p) % kAlign, 0);
531531
DCHECK_EQ(reinterpret_cast<uptr>(end) % kAlign, 0);
@@ -569,6 +569,7 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {
569569
RawShadow* mid1 =
570570
Min(end, reinterpret_cast<RawShadow*>(RoundUp(
571571
reinterpret_cast<uptr>(begin) + kPageSize / 2, kPageSize)));
572+
// begin must < mid1
572573
ShadowSet(begin, mid1, val);
573574
// Reset middle part.
574575
RawShadow* mid2 = RoundDown(end, kPageSize);
@@ -577,7 +578,10 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {
577578
Die();
578579
}
579580
// Set the ending.
580-
ShadowSet(mid2, end, val);
581+
if (mid2 < end)
582+
ShadowSet(mid2, end, val);
583+
else
584+
DCHECK_EQ(mid2, end);
581585
}
582586

583587
void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) {

0 commit comments

Comments
 (0)