aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/compiler-rt/lib/msan/msan_poisoning.cpp
diff options
context:
space:
mode:
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.cpp13
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());
}