Module Name: src Committed By: maxv Date: Sat May 4 10:07:11 UTC 2019
Modified Files: src/sys/kern: subr_asan.c src/sys/sys: systm.h Log Message: Add KASAN instrumentation for kcopy and copystr. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/kern/subr_asan.c cvs rdiff -u -r1.283 -r1.284 src/sys/sys/systm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_asan.c diff -u src/sys/kern/subr_asan.c:1.7 src/sys/kern/subr_asan.c:1.8 --- src/sys/kern/subr_asan.c:1.7 Thu Apr 11 17:43:45 2019 +++ src/sys/kern/subr_asan.c Sat May 4 10:07:10 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_asan.c,v 1.7 2019/04/11 17:43:45 maxv Exp $ */ +/* $NetBSD: subr_asan.c,v 1.8 2019/05/04 10:07:10 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.7 2019/04/11 17:43:45 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.8 2019/05/04 10:07:10 maxv Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -479,18 +479,39 @@ kasan_strlen(const char *str) return (s - str); } +#undef kcopy +#undef copystr #undef copyinstr #undef copyoutstr #undef copyin +int kasan_kcopy(const void *, void *, size_t); +int kasan_copystr(const void *, void *, size_t, size_t *); int kasan_copyinstr(const void *, void *, size_t, size_t *); int kasan_copyoutstr(const void *, void *, size_t, size_t *); int kasan_copyin(const void *, void *, size_t); +int kcopy(const void *, void *, size_t); +int copystr(const void *, void *, size_t, size_t *); int copyinstr(const void *, void *, size_t, size_t *); int copyoutstr(const void *, void *, size_t, size_t *); int copyin(const void *, void *, size_t); int +kasan_kcopy(const void *src, void *dst, size_t len) +{ + kasan_shadow_check((unsigned long)src, len, false, __RET_ADDR); + kasan_shadow_check((unsigned long)dst, len, true, __RET_ADDR); + return kcopy(src, dst, len); +} + +int +kasan_copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done) +{ + kasan_shadow_check((unsigned long)kdaddr, len, true, __RET_ADDR); + return copystr(kfaddr, kdaddr, len, done); +} + +int kasan_copyin(const void *uaddr, void *kaddr, size_t len) { kasan_shadow_check((unsigned long)kaddr, len, true, __RET_ADDR); Index: src/sys/sys/systm.h diff -u src/sys/sys/systm.h:1.283 src/sys/sys/systm.h:1.284 --- src/sys/sys/systm.h:1.283 Thu Apr 11 17:43:45 2019 +++ src/sys/sys/systm.h Sat May 4 10:07:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: systm.h,v 1.283 2019/04/11 17:43:45 maxv Exp $ */ +/* $NetBSD: systm.h,v 1.284 2019/05/04 10:07:11 maxv Exp $ */ /*- * Copyright (c) 1982, 1988, 1991, 1993 @@ -260,7 +260,12 @@ int format_bytes(char *, size_t, uint64_ void tablefull(const char *, const char *); +#if defined(_KERNEL) && defined(KASAN) +int kasan_kcopy(const void *, void *, size_t); +#define kcopy kasan_kcopy +#else int kcopy(const void *, void *, size_t); +#endif #ifdef _KERNEL #define bcopy(src, dst, len) memcpy((dst), (src), (len)) @@ -268,15 +273,17 @@ int kcopy(const void *, void *, size_t); #define bcmp(a, b, len) memcmp((a), (b), (len)) #endif /* KERNEL */ -int copystr(const void *, void *, size_t, size_t *); #if defined(_KERNEL) && defined(KASAN) +int kasan_copystr(const void *, void *, size_t, size_t *); int kasan_copyinstr(const void *, void *, size_t, size_t *); int kasan_copyoutstr(const void *, void *, size_t, size_t *); int kasan_copyin(const void *, void *, size_t); +#define copystr kasan_copystr #define copyinstr kasan_copyinstr #define copyoutstr kasan_copyoutstr #define copyin kasan_copyin #else +int copystr(const void *, void *, size_t, size_t *); int copyinstr(const void *, void *, size_t, size_t *); int copyoutstr(const void *, void *, size_t, size_t *); int copyin(const void *, void *, size_t);