Add KASAN instrumentation for kcopy and copystr.

This commit is contained in:
maxv 2019-05-04 10:07:10 +00:00
parent 9a12fddfce
commit 50a5f274ac
2 changed files with 32 additions and 4 deletions

View File

@ -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,17 +479,38 @@ 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)
{

View File

@ -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_t);
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);