Commit 7d8ad890 authored by Marco Elver's avatar Marco Elver Committed by Linus Torvalds

mm/kasan: introduce __kasan_check_{read,write}

Patch series "mm/kasan: Add object validation in ksize()", v3.

This patch (of 5):

This introduces __kasan_check_{read,write}.  __kasan_check functions may
be used from anywhere, even compilation units that disable instrumentation
selectively.

This change eliminates the need for the __KASAN_INTERNAL definition.

[elver@google.com: v5]
  Link: http://lkml.kernel.org/r/20190708170706.174189-2-elver@google.com
Link: http://lkml.kernel.org/r/20190626142014.141844-2-elver@google.comSigned-off-by: default avatarMarco Elver <elver@google.com>
Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
Reviewed-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Andrey Konovalov <andreyknvl@google.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Kees Cook <keescook@chromium.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 751ad98d
...@@ -2,9 +2,28 @@ ...@@ -2,9 +2,28 @@
#ifndef _LINUX_KASAN_CHECKS_H #ifndef _LINUX_KASAN_CHECKS_H
#define _LINUX_KASAN_CHECKS_H #define _LINUX_KASAN_CHECKS_H
#if defined(__SANITIZE_ADDRESS__) || defined(__KASAN_INTERNAL) /*
void kasan_check_read(const volatile void *p, unsigned int size); * __kasan_check_*: Always available when KASAN is enabled. This may be used
void kasan_check_write(const volatile void *p, unsigned int size); * even in compilation units that selectively disable KASAN, but must use KASAN
* to validate access to an address. Never use these in header files!
*/
#ifdef CONFIG_KASAN
void __kasan_check_read(const volatile void *p, unsigned int size);
void __kasan_check_write(const volatile void *p, unsigned int size);
#else
static inline void __kasan_check_read(const volatile void *p, unsigned int size)
{ }
static inline void __kasan_check_write(const volatile void *p, unsigned int size)
{ }
#endif
/*
* kasan_check_*: Only available when the particular compilation unit has KASAN
* instrumentation enabled. May be used in header files.
*/
#ifdef __SANITIZE_ADDRESS__
#define kasan_check_read __kasan_check_read
#define kasan_check_write __kasan_check_write
#else #else
static inline void kasan_check_read(const volatile void *p, unsigned int size) static inline void kasan_check_read(const volatile void *p, unsigned int size)
{ } { }
......
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
* *
*/ */
#define __KASAN_INTERNAL
#include <linux/export.h> #include <linux/export.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -89,17 +87,17 @@ void kasan_disable_current(void) ...@@ -89,17 +87,17 @@ void kasan_disable_current(void)
current->kasan_depth--; current->kasan_depth--;
} }
void kasan_check_read(const volatile void *p, unsigned int size) void __kasan_check_read(const volatile void *p, unsigned int size)
{ {
check_memory_region((unsigned long)p, size, false, _RET_IP_); check_memory_region((unsigned long)p, size, false, _RET_IP_);
} }
EXPORT_SYMBOL(kasan_check_read); EXPORT_SYMBOL(__kasan_check_read);
void kasan_check_write(const volatile void *p, unsigned int size) void __kasan_check_write(const volatile void *p, unsigned int size)
{ {
check_memory_region((unsigned long)p, size, true, _RET_IP_); check_memory_region((unsigned long)p, size, true, _RET_IP_);
} }
EXPORT_SYMBOL(kasan_check_write); EXPORT_SYMBOL(__kasan_check_write);
#undef memset #undef memset
void *memset(void *addr, int c, size_t len) void *memset(void *addr, int c, size_t len)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment