summaryrefslogtreecommitdiffstats
path: root/compiler-rt
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt')
-rw-r--r--compiler-rt/include/sanitizer/msan_interface.h5
-rw-r--r--compiler-rt/lib/msan/msan_interceptors.cc13
2 files changed, 18 insertions, 0 deletions
diff --git a/compiler-rt/include/sanitizer/msan_interface.h b/compiler-rt/include/sanitizer/msan_interface.h
index 1a76dd60599..601dba16b3c 100644
--- a/compiler-rt/include/sanitizer/msan_interface.h
+++ b/compiler-rt/include/sanitizer/msan_interface.h
@@ -117,6 +117,11 @@ const char *__msan_get_origin_descr_if_stack(u32 id);
SANITIZER_INTERFACE_ATTRIBUTE
void __msan_partial_poison(void* data, void* shadow, uptr size);
+// Tell MSan about newly allocated memory (ex.: custom allocator).
+// Memory will be marked uninitialized, with origin at the call site.
+SANITIZER_INTERFACE_ATTRIBUTE
+void __msan_allocated_memory(void* data, uptr size);
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc
index 0672bcf78c9..635bff14dbc 100644
--- a/compiler-rt/lib/msan/msan_interceptors.cc
+++ b/compiler-rt/lib/msan/msan_interceptors.cc
@@ -20,6 +20,7 @@
#include "msan_platform_limits_posix.h"
#include "sanitizer_common/sanitizer_allocator.h"
#include "sanitizer_common/sanitizer_common.h"
+#include "sanitizer_common/sanitizer_stackdepot.h"
#include "sanitizer_common/sanitizer_libc.h"
#include <stdarg.h>
@@ -710,6 +711,18 @@ INTERCEPTOR(void *, malloc, SIZE_T size) {
return MsanReallocate(&stack, 0, size, sizeof(u64), false);
}
+void __msan_allocated_memory(void* data, uptr size) {
+ GET_MALLOC_STACK_TRACE;
+ if (flags()->poison_in_malloc)
+ __msan_poison(data, size);
+ if (__msan_get_track_origins()) {
+ u32 stack_id = StackDepotPut(stack.trace, stack.size);
+ CHECK(stack_id);
+ CHECK_EQ((stack_id >> 31), 0); // Higher bit is occupied by stack origins.
+ __msan_set_origin(data, size, stack_id);
+ }
+}
+
INTERCEPTOR(void *, mmap, void *addr, SIZE_T length, int prot, int flags,
int fd, OFF_T offset) {
ENSURE_MSAN_INITED();
OpenPOWER on IntegriCloud