Skip to content

Commit eedddb9

Browse files
committed
Use RoundUp on demand instead of a new util function
We don't always need to get the real shadow end, for example, some shadow clear, if using the real shadow end, it will cause overcleaning (i.e., clear [0, 1) makes [1, 8) inaccessible when kShadowCell == 8). So when we do need to get the real end, use RoundUp in place. For example, `unmap(addr, sz)` makes `[addr + sz, addr + PageSize)` inaccessible, so we can safely clean up the full shadow (by getting the real shadow end).
1 parent 71da1d8 commit eedddb9

File tree

5 files changed

+15
-26
lines changed

5 files changed

+15
-26
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ void __tsan_java_move(jptr src, jptr dst, jptr size) {
131131
// We used to move shadow from src to dst, but the trace format does not
132132
// support that anymore as it contains addresses of accesses.
133133
RawShadow *d = MemToShadow(dst);
134-
RawShadow *dend = MemToEndShadow(dst + size);
134+
RawShadow *dend = MemToShadow(dst + size);
135135
ShadowSet(d, dend, Shadow::kEmpty);
136136
}
137137

compiler-rt/lib/tsan/rtl/tsan_platform.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -968,24 +968,6 @@ RawShadow *MemToShadow(uptr x) {
968968
return reinterpret_cast<RawShadow *>(SelectMapping<MemToShadowImpl>(x));
969969
}
970970

971-
struct MemToEndShadowImpl {
972-
template <typename Mapping>
973-
static uptr Apply(uptr x) {
974-
return (((x + kShadowCell - 1) &
975-
~(Mapping::kShadowMsk | (kShadowCell - 1))) ^
976-
Mapping::kShadowXor) *
977-
kShadowMultiplier +
978-
Mapping::kShadowAdd;
979-
}
980-
};
981-
982-
// If addr % kShadowCell == 0, then MemToEndShadow(addr) == MemToShadow(addr)
983-
// Otherwise, MemToEndShadow(addr) == MemToShadow(addr) + kShadowCnt
984-
ALWAYS_INLINE
985-
RawShadow *MemToEndShadow(uptr x) {
986-
return reinterpret_cast<RawShadow *>(SelectMapping<MemToEndShadowImpl>(x));
987-
}
988-
989971
struct MemToMetaImpl {
990972
template <typename Mapping>
991973
static u32 *Apply(uptr x) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ static NOINLINE void MapRodata(char* buffer, uptr size) {
195195
!segment.IsWritable() && IsAppMem(segment.start)) {
196196
// Assume it's .rodata
197197
char *shadow_start = (char *)MemToShadow(segment.start);
198-
char *shadow_end = (char *)MemToEndShadow(segment.end);
198+
char *shadow_end = (char *)MemToShadow(segment.end);
199199
for (char *p = shadow_start; p < shadow_end;
200200
p += marker.size() * sizeof(RawShadow)) {
201201
internal_mmap(

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ static void StopBackgroundThread() {
532532

533533
void DontNeedShadowFor(uptr addr, uptr size) {
534534
ReleaseMemoryPagesToOS(reinterpret_cast<uptr>(MemToShadow(addr)),
535-
reinterpret_cast<uptr>(MemToEndShadow(addr + size)));
535+
reinterpret_cast<uptr>(MemToShadow(addr + size)));
536536
}
537537

538538
#if !SANITIZER_GO
@@ -566,13 +566,18 @@ static bool IsValidMmapRange(uptr addr, uptr size) {
566566
return false;
567567
}
568568

569-
void UnmapShadow(ThreadState *thr, uptr addr, uptr size) {
569+
void UnmapShadow(ThreadState* thr, uptr addr, uptr size) {
570570
if (size == 0 || !IsValidMmapRange(addr, size))
571571
return;
572-
DontNeedShadowFor(addr, size);
572+
// unmap shadow is related to semantic of mmap/munmap, so we
573+
// should clear the whole shadow range, including the tail shadow
574+
// while addr + size % kShadowCell != 0.
575+
uptr size_for_shadow = RoundUp(addr + size, kShadowCell) - addr;
576+
DontNeedShadowFor(addr, size_for_shadow);
573577
ScopedGlobalProcessor sgp;
574578
SlotLocker locker(thr, true);
575-
ctx->metamap.ResetRange(thr->proc(), addr, size, true);
579+
uptr size_for_meta = RoundUp(addr + size, kMetaShadowCell) - addr;
580+
ctx->metamap.ResetRange(thr->proc(), addr, size_for_meta, true);
576581
}
577582
#endif
578583

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -688,8 +688,10 @@ void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) {
688688
DCHECK(IsShadowMem(shadow_mem));
689689
}
690690

691-
RawShadow* shadow_mem_end = MemToEndShadow(addr + size);
692-
if (size > 0 && !IsShadowMem(shadow_mem_end - 1)) {
691+
uptr size1 =
692+
(RoundUpTo(addr + size, kShadowCell) - RoundDownTo(addr, kShadowCell));
693+
RawShadow* shadow_mem_end = shadow_mem + size1 / kShadowCell * kShadowCnt;
694+
if (!IsShadowMem(shadow_mem_end - 1)) {
693695
Printf("Bad shadow end addr: %p (%p)\n", shadow_mem_end - 1,
694696
(void*)(addr + size - 1));
695697
Printf(

0 commit comments

Comments
 (0)