|
@@ -7,6 +7,7 @@
|
|
|
#include <linux/compiler.h>
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/lockdep.h>
|
|
|
+#include <linux/kasan-checks.h>
|
|
|
#include <asm/alternative.h>
|
|
|
#include <asm/cpufeatures.h>
|
|
|
#include <asm/page.h>
|
|
@@ -109,6 +110,7 @@ static __always_inline __must_check
|
|
|
int __copy_from_user(void *dst, const void __user *src, unsigned size)
|
|
|
{
|
|
|
might_fault();
|
|
|
+ kasan_check_write(dst, size);
|
|
|
return __copy_from_user_nocheck(dst, src, size);
|
|
|
}
|
|
|
|
|
@@ -175,6 +177,7 @@ static __always_inline __must_check
|
|
|
int __copy_to_user(void __user *dst, const void *src, unsigned size)
|
|
|
{
|
|
|
might_fault();
|
|
|
+ kasan_check_read(src, size);
|
|
|
return __copy_to_user_nocheck(dst, src, size);
|
|
|
}
|
|
|
|
|
@@ -242,12 +245,14 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
|
|
|
static __must_check __always_inline int
|
|
|
__copy_from_user_inatomic(void *dst, const void __user *src, unsigned size)
|
|
|
{
|
|
|
+ kasan_check_write(dst, size);
|
|
|
return __copy_from_user_nocheck(dst, src, size);
|
|
|
}
|
|
|
|
|
|
static __must_check __always_inline int
|
|
|
__copy_to_user_inatomic(void __user *dst, const void *src, unsigned size)
|
|
|
{
|
|
|
+ kasan_check_read(src, size);
|
|
|
return __copy_to_user_nocheck(dst, src, size);
|
|
|
}
|
|
|
|
|
@@ -258,6 +263,7 @@ static inline int
|
|
|
__copy_from_user_nocache(void *dst, const void __user *src, unsigned size)
|
|
|
{
|
|
|
might_fault();
|
|
|
+ kasan_check_write(dst, size);
|
|
|
return __copy_user_nocache(dst, src, size, 1);
|
|
|
}
|
|
|
|
|
@@ -265,6 +271,7 @@ static inline int
|
|
|
__copy_from_user_inatomic_nocache(void *dst, const void __user *src,
|
|
|
unsigned size)
|
|
|
{
|
|
|
+ kasan_check_write(dst, size);
|
|
|
return __copy_user_nocache(dst, src, size, 0);
|
|
|
}
|
|
|
|