diff options
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp')
-rw-r--r-- | contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp b/contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp index a92b0565cfa8..1889e980bfc0 100644 --- a/contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp +++ b/contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp @@ -14,6 +14,7 @@ #include "interception/interception.h" #include "msan_origin.h" +#include "msan_thread.h" #include "sanitizer_common/sanitizer_common.h" DECLARE_REAL(void *, memset, void *dest, int c, uptr n) @@ -213,8 +214,15 @@ void SetShadow(const void *ptr, uptr size, u8 value) { if (page_end != shadow_end) { REAL(memset)((void *)page_end, 0, shadow_end - page_end); } - if (!MmapFixedNoReserve(page_beg, page_end - page_beg)) + if (!MmapFixedSuperNoReserve(page_beg, page_end - page_beg)) Die(); + + if (__msan_get_track_origins()) { + // No need to set origin for zero shadow, but we can release pages. + uptr origin_beg = RoundUpTo(MEM_TO_ORIGIN(ptr), PageSize); + if (!MmapFixedSuperNoReserve(origin_beg, page_end - page_beg)) + Die(); + } } } } @@ -241,6 +249,9 @@ void PoisonMemory(const void *dst, uptr size, StackTrace *stack) { SetShadow(dst, size, (u8)-1); if (__msan_get_track_origins()) { + MsanThread *t = GetCurrentThread(); + if (t && t->InSignalHandler()) + return; Origin o = Origin::CreateHeapOrigin(stack); SetOrigin(dst, size, o.raw_id()); } |