#ifndef _included_clib_sanitizer_h #define _included_clib_sanitizer_h #ifdef CLIB_SANITIZE_ADDR #include <sanitizer/asan_interface.h> #include <vppinfra/clib.h> #define CLIB_NOSANITIZE_ADDR __attribute__((no_sanitize_address)) #define CLIB_MEM_POISON(a, s) ASAN_POISON_MEMORY_REGION((a), (s)) #define CLIB_MEM_UNPOISON(a, s) ASAN_UNPOISON_MEMORY_REGION((a), (s)) #define CLIB_MEM_OVERFLOW(f, src, n) \ ({ \ typeof (f) clib_mem_overflow_ret__; \ const void *clib_mem_overflow_src__ = (src); \ size_t clib_mem_overflow_n__ = (n); \ const void *clib_mem_overflow_start__ = __asan_region_is_poisoned((void *)clib_mem_overflow_src__, clib_mem_overflow_n__); \ clib_mem_overflow_n__ -= (size_t)(clib_mem_overflow_start__ - clib_mem_overflow_src__); \ if (clib_mem_overflow_start__) \ CLIB_MEM_UNPOISON(clib_mem_overflow_start__, clib_mem_overflow_n__); \ clib_mem_overflow_ret__ = f; \ if (clib_mem_overflow_start__) \ CLIB_MEM_POISON(clib_mem_overflow_start__, clib_mem_overflow_n__); \ clib_mem_overflow_ret__; \ }) #define CLIB_MEM_OVERFLOW_LOAD(f, src) \ ({ \ typeof(src) clib_mem_overflow_load_src__ = (src); \ CLIB_MEM_OVERFLOW(f(clib_mem_overflow_load_src__), clib_mem_overflow_load_src__, sizeof(typeof(f(clib_mem_overflow_load_src__)))); \ }) static_always_inline void CLIB_MEM_POISON_LEN (void *src, size_t oldlen, size_t newlen) { if (oldlen > newlen) CLIB_MEM_POISON (src + newlen, oldlen - newlen); else if (newlen > oldlen) CLIB_MEM_UNPOISON (src + oldlen, newlen - oldlen); } #else /* CLIB_SANITIZE_ADDR */ #define CLIB_NOSANITIZE_ADDR #define CLIB_MEM_POISON(a, s) (void)(a) #define CLIB_MEM_UNPOISON(a, s) (void)(a) #define CLIB_MEM_OVERFLOW(a, b, c) a #define CLIB_MEM_OVERFLOW_LOAD(f, src) f(src) #define CLIB_MEM_POISON_LEN(a, b, c) #endif /* CLIB_SANITIZE_ADDR */ #endif /* _included_clib_sanitizer_h */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */