[asan] when a fake stack is being unmapped also flush the corresponding shadow
llvm-svn: 197040
This commit is contained in:
parent
bb08e62dd6
commit
e55d388e71
|
|
@ -42,12 +42,7 @@ struct AsanMapUnmapCallback {
|
|||
PoisonShadow(p, size, 0);
|
||||
// We are about to unmap a chunk of user memory.
|
||||
// Mark the corresponding shadow memory as not needed.
|
||||
// Since asan's mapping is compacting, the shadow chunk may be
|
||||
// not page-aligned, so we only flush the page-aligned portion.
|
||||
uptr page_size = GetPageSizeCached();
|
||||
uptr shadow_beg = RoundUpTo(MemToShadow(p), page_size);
|
||||
uptr shadow_end = RoundDownTo(MemToShadow(p + size), page_size);
|
||||
FlushUnneededShadowMemory(shadow_beg, shadow_end - shadow_beg);
|
||||
FlushUnneededASanShadowMemory(p, size);
|
||||
// Statistics.
|
||||
AsanStats &thread_stats = GetCurrentThreadStats();
|
||||
thread_stats.munmaps++;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,9 @@ void FakeStack::Destroy(int tid) {
|
|||
NumberOfFrames(stack_size_log(), class_id));
|
||||
Report("T%d: FakeStack destroyed: %s\n", tid, str.data());
|
||||
}
|
||||
UnmapOrDie(this, RequiredSize(stack_size_log_));
|
||||
uptr size = RequiredSize(stack_size_log_);
|
||||
FlushUnneededASanShadowMemory(reinterpret_cast<uptr>(this), size);
|
||||
UnmapOrDie(this, size);
|
||||
}
|
||||
|
||||
void FakeStack::PoisonAll(u8 magic) {
|
||||
|
|
|
|||
|
|
@ -50,6 +50,15 @@ struct ShadowSegmentEndpoint {
|
|||
}
|
||||
};
|
||||
|
||||
void FlushUnneededASanShadowMemory(uptr p, uptr size) {
|
||||
// Since asan's mapping is compacting, the shadow chunk may be
|
||||
// not page-aligned, so we only flush the page-aligned portion.
|
||||
uptr page_size = GetPageSizeCached();
|
||||
uptr shadow_beg = RoundUpTo(MemToShadow(p), page_size);
|
||||
uptr shadow_end = RoundDownTo(MemToShadow(p + size), page_size);
|
||||
FlushUnneededShadowMemory(shadow_beg, shadow_end - shadow_beg);
|
||||
}
|
||||
|
||||
} // namespace __asan
|
||||
|
||||
// ---------------------- Interface ---------------- {{{1
|
||||
|
|
|
|||
|
|
@ -57,4 +57,8 @@ ALWAYS_INLINE void FastPoisonShadowPartialRightRedzone(
|
|||
}
|
||||
}
|
||||
|
||||
// Calls __sanitizer::FlushUnneededShadowMemory() on
|
||||
// [MemToShadow(p), MemToShadow(p+size)] with proper rounding.
|
||||
void FlushUnneededASanShadowMemory(uptr p, uptr size);
|
||||
|
||||
} // namespace __asan
|
||||
|
|
|
|||
Loading…
Reference in New Issue