[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