diff --git a/sys/libkern/bcopy.c b/sys/libkern/bcopy.c --- a/sys/libkern/bcopy.c +++ b/sys/libkern/bcopy.c @@ -42,6 +42,19 @@ #undef memcpy #undef memmove +#if defined(KASAN) || defined(KCSAN) +void * +memcpy(void *dst, const void *src, size_t len) +{ + return (SAN_INTERCEPTOR(memcpy)(dst, src, len)); +} + +void * +memmove(void *dst, const void *src, size_t len) +{ + return (SAN_INTERCEPTOR(memmove)(dst, src, len)); +} +#else /* !KASAN && !KCSAN */ /* * sizeof(word) MUST BE A POWER OF TWO * SO THAT wmask BELOW IS ALL ONES @@ -135,3 +148,4 @@ } __strong_reference(memcpy, memmove); +#endif /* KASAN || KCSAN */ diff --git a/sys/libkern/memcmp.c b/sys/libkern/memcmp.c --- a/sys/libkern/memcmp.c +++ b/sys/libkern/memcmp.c @@ -41,6 +41,9 @@ int (memcmp)(const void *s1, const void *s2, size_t n) { +#if defined(KASAN) || defined(KCSAN) + return (SAN_INTERCEPTOR(memcmp)(s1, s2, n)); +#else if (n != 0) { const unsigned char *p1 = s1, *p2 = s2; @@ -50,4 +53,5 @@ } while (--n != 0); } return (0); +#endif } diff --git a/sys/libkern/memset.c b/sys/libkern/memset.c --- a/sys/libkern/memset.c +++ b/sys/libkern/memset.c @@ -33,9 +33,13 @@ void * (memset)(void *b, int c, size_t len) { +#if defined(KASAN) || defined(KCSAN) + return (SAN_INTERCEPTOR(memset)(b, c, len)); +#else char *bb; for (bb = (char *)b; len--; ) *bb++ = c; return (b); +#endif } diff --git a/sys/libkern/strcmp.c b/sys/libkern/strcmp.c --- a/sys/libkern/strcmp.c +++ b/sys/libkern/strcmp.c @@ -41,8 +41,12 @@ int (strcmp)(const char *s1, const char *s2) { +#if defined(KASAN) || defined(KCSAN) + return (SAN_INTERCEPTOR(strcmp)(s1, s2)); +#else while (*s1 == *s2++) if (*s1++ == '\0') return (0); return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1)); +#endif } diff --git a/sys/libkern/strcpy.c b/sys/libkern/strcpy.c --- a/sys/libkern/strcpy.c +++ b/sys/libkern/strcpy.c @@ -35,8 +35,12 @@ char * (strcpy)(char * __restrict to, const char * __restrict from) { +#if defined(KASAN) || defined(KCSAN) + return (SAN_INTERCEPTOR(strcpy)(to, from)); +#else char *save = to; for (; (*to = *from) != 0; ++from, ++to); return(save); +#endif } diff --git a/sys/libkern/strlen.c b/sys/libkern/strlen.c --- a/sys/libkern/strlen.c +++ b/sys/libkern/strlen.c @@ -29,6 +29,13 @@ #include #include +#if defined(KASAN) || defined(KCSAN) +size_t +(strlen)(const char *str) +{ + return (SAN_INTERCEPTOR(strlen)(str)); +} +#else /* !KASAN && !KCSAN */ /* * Portable strlen() for 32-bit and 64-bit systems. * @@ -119,3 +126,4 @@ /* NOTREACHED */ return (0); } +#endif /* KASAN || KCSAN */