1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#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:
*/
|