[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`.
This commit is contained in:
@@ -523,9 +523,9 @@ SECOND:
|
||||
}
|
||||
|
||||
void ShadowSet(RawShadow* p, RawShadow* end, RawShadow v) {
|
||||
DCHECK_LE(p, end);
|
||||
DCHECK_LT(p, end);
|
||||
DCHECK(IsShadowMem(p));
|
||||
DCHECK(p == end || IsShadowMem(end - 1));
|
||||
DCHECK(IsShadowMem(end - 1));
|
||||
UNUSED const uptr kAlign = kShadowCnt * kShadowSize;
|
||||
DCHECK_EQ(reinterpret_cast<uptr>(p) % kAlign, 0);
|
||||
DCHECK_EQ(reinterpret_cast<uptr>(end) % kAlign, 0);
|
||||
@@ -569,6 +569,7 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {
|
||||
RawShadow* mid1 =
|
||||
Min(end, reinterpret_cast<RawShadow*>(RoundUp(
|
||||
reinterpret_cast<uptr>(begin) + kPageSize / 2, kPageSize)));
|
||||
// begin must < mid1
|
||||
ShadowSet(begin, mid1, val);
|
||||
// Reset middle part.
|
||||
RawShadow* mid2 = RoundDown(end, kPageSize);
|
||||
@@ -577,7 +578,10 @@ static void MemoryRangeSet(uptr addr, uptr size, RawShadow val) {
|
||||
Die();
|
||||
}
|
||||
// Set the ending.
|
||||
ShadowSet(mid2, end, val);
|
||||
if (mid2 < end)
|
||||
ShadowSet(mid2, end, val);
|
||||
else
|
||||
DCHECK_EQ(mid2, end);
|
||||
}
|
||||
|
||||
void MemoryResetRange(ThreadState* thr, uptr pc, uptr addr, uptr size) {
|
||||
|
||||
Reference in New Issue
Block a user