From 78b5d1068a1e18e03d06ab211d2414482cec9bce Mon Sep 17 00:00:00 2001 From: Brian Sumner Date: Thu, 29 Jun 2023 13:49:16 -0700 Subject: [PATCH] SWDEV-408660 - add needed address space checks to memory functions Change-Id: I7052efafb54fc6d9133dff220c06757e06f34ea0 (cherry picked from commit 085094d45953c7cc2e91c14078c2e2a0b86d0a5e) --- asanrtl/src/memintrinsics.cl | 47 +++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/asanrtl/src/memintrinsics.cl b/asanrtl/src/memintrinsics.cl index 57a47ea..794e8e7 100644 --- a/asanrtl/src/memintrinsics.cl +++ b/asanrtl/src/memintrinsics.cl @@ -10,20 +10,23 @@ NO_SANITIZE_ADDR static void -check_memory_range_accessible(void* dest, const void* src, - uptr size, uptr pc) { +check_memory_range_accessible(const void* dst, const void* src, uptr size, uptr pc) +{ if (size == 0) return; - uptr invalid_addr = 0; - uptr src_addr = (uptr)src; - invalid_addr = __asan_region_is_poisoned(src_addr, size); - if (invalid_addr) { - REPORT_IMPL(pc, invalid_addr, false, size, false) + + if (!__ockl_is_private_addr(src) && !__ockl_is_local_addr(src)) { + uptr invalid_addr = __asan_region_is_poisoned((uptr)src, size); + if (invalid_addr) { + REPORT_IMPL(pc, invalid_addr, false, size, false) + } } - uptr dest_addr = (uptr)dest; - invalid_addr = __asan_region_is_poisoned(dest_addr, size); - if (invalid_addr) { - REPORT_IMPL(pc, invalid_addr, true, size, false) + + if (!__ockl_is_private_addr(dst) && !__ockl_is_local_addr(dst)) { + uptr invalid_addr = __asan_region_is_poisoned((uptr)dst, size); + if (invalid_addr) { + REPORT_IMPL(pc, invalid_addr, true, size, false) + } } } @@ -31,7 +34,8 @@ USED NO_INLINE NO_SANITIZE_ADDR void* -__asan_memcpy(void* to, const void* from, uptr size) { +__asan_memcpy(void* to, const void* from, uptr size) +{ uptr pc = GET_CALLER_PC(); check_memory_range_accessible(to, from, size, pc); return __builtin_memcpy(to, from, size); @@ -41,7 +45,8 @@ USED NO_INLINE NO_SANITIZE_ADDR void* -__asan_memmove(void* to, const void* from, uptr size) { +__asan_memmove(void* to, const void* from, uptr size) +{ uptr pc = GET_CALLER_PC(); check_memory_range_accessible(to, from, size, pc); return __builtin_memmove(to, from, size); @@ -51,13 +56,17 @@ USED NO_INLINE NO_SANITIZE_ADDR void* -__asan_memset(void* s, int c, uptr n) { +__asan_memset(void* s, int c, uptr n) +{ uptr pc = GET_CALLER_PC(); - uptr src_addr = (uptr)s; - uptr invalid_addr = 0; - invalid_addr = __asan_region_is_poisoned(src_addr, n); - if (invalid_addr) { - REPORT_IMPL(pc, invalid_addr, true, n, false) + + if (!__ockl_is_private_addr(s) && !__ockl_is_local_addr(s)) { + uptr invalid_addr = __asan_region_is_poisoned((uptr)s, n); + if (invalid_addr) { + REPORT_IMPL(pc, invalid_addr, true, n, false) + } } + return __builtin_memset(s, c, n); } +