@@ -38,6 +38,12 @@ bool __kasan_check_write(const volatile void *p, unsigned int size)
3838}
3939EXPORT_SYMBOL (__kasan_check_write );
4040
41+ #ifndef CONFIG_GENERIC_ENTRY
42+ /*
43+ * CONFIG_GENERIC_ENTRY relies on compiler emitted mem*() calls to not be
44+ * instrumented. KASAN enabled toolchains should emit __asan_mem*() functions
45+ * for the sites they want to instrument.
46+ */
4147#undef memset
4248void * memset (void * addr , int c , size_t len )
4349{
@@ -68,6 +74,38 @@ void *memcpy(void *dest, const void *src, size_t len)
6874
6975 return __memcpy (dest , src , len );
7076}
77+ #endif
78+
79+ void * __asan_memset (void * addr , int c , size_t len )
80+ {
81+ if (!kasan_check_range ((unsigned long )addr , len , true, _RET_IP_ ))
82+ return NULL ;
83+
84+ return __memset (addr , c , len );
85+ }
86+ EXPORT_SYMBOL (__asan_memset );
87+
88+ #ifdef __HAVE_ARCH_MEMMOVE
89+ void * __asan_memmove (void * dest , const void * src , size_t len )
90+ {
91+ if (!kasan_check_range ((unsigned long )src , len , false, _RET_IP_ ) ||
92+ !kasan_check_range ((unsigned long )dest , len , true, _RET_IP_ ))
93+ return NULL ;
94+
95+ return __memmove (dest , src , len );
96+ }
97+ EXPORT_SYMBOL (__asan_memmove );
98+ #endif
99+
100+ void * __asan_memcpy (void * dest , const void * src , size_t len )
101+ {
102+ if (!kasan_check_range ((unsigned long )src , len , false, _RET_IP_ ) ||
103+ !kasan_check_range ((unsigned long )dest , len , true, _RET_IP_ ))
104+ return NULL ;
105+
106+ return __memcpy (dest , src , len );
107+ }
108+ EXPORT_SYMBOL (__asan_memcpy );
71109
72110void kasan_poison (const void * addr , size_t size , u8 value , bool init )
73111{
0 commit comments