diff options
Diffstat (limited to 'compiler-rt')
-rw-r--r-- | compiler-rt/include/sanitizer/msan_interface.h | 5 | ||||
-rw-r--r-- | compiler-rt/lib/msan/msan_interceptors.cc | 13 |
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(); |