BACKPORT: mm/kasan: add API to check memory regions
authorAndrey Ryabinin <aryabinin@virtuozzo.com>
Fri, 20 May 2016 23:59:28 +0000 (16:59 -0700)
committerPaul Lawrence <paullawrence@google.com>
Thu, 14 Dec 2017 16:20:16 +0000 (08:20 -0800)
Memory access coded in an assembly won't be seen by KASAN as a compiler
can instrument only C code.  Add kasan_check_[read,write]() API which is
going to be used to check a certain memory range.

Link: http://lkml.kernel.org/r/1462538722-1574-3-git-send-email-aryabinin@virtuozzo.com
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Acked-by: Alexander Potapenko <glider@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Bug: 64145065
(cherry-picked from 64f8ebaf115bcddc4aaa902f981c57ba6506bc42)
Change-Id: I3e75c7c22e77d390c55ca1b86ec58a6d6ea1da87
Signed-off-by: Paul Lawrence <paullawrence@google.com>
MAINTAINERS
include/linux/kasan-checks.h [new file with mode: 0644]
mm/kasan/kasan.c

index e1e620dd3f78a1255402aeed17671fca1404594c..263e4dfb3fb0e2bc0fe88a18428eb8adaf1ea5f1 100644 (file)
@@ -5982,6 +5982,20 @@ S:       Maintained
 F:     Documentation/hwmon/k8temp
 F:     drivers/hwmon/k8temp.c
 
+KASAN
+M:     Andrey Ryabinin <aryabinin@virtuozzo.com>
+R:     Alexander Potapenko <glider@google.com>
+R:     Dmitry Vyukov <dvyukov@google.com>
+L:     kasan-dev@googlegroups.com
+S:     Maintained
+F:     arch/*/include/asm/kasan.h
+F:     arch/*/mm/kasan_init*
+F:     Documentation/kasan.txt
+F:     include/linux/kasan*.h
+F:     lib/test_kasan.c
+F:     mm/kasan/
+F:     scripts/Makefile.kasan
+
 KCONFIG
 M:     "Yann E. MORIN" <yann.morin.1998@free.fr>
 L:     linux-kbuild@vger.kernel.org
diff --git a/include/linux/kasan-checks.h b/include/linux/kasan-checks.h
new file mode 100644 (file)
index 0000000..b7f8ace
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _LINUX_KASAN_CHECKS_H
+#define _LINUX_KASAN_CHECKS_H
+
+#ifdef CONFIG_KASAN
+void kasan_check_read(const void *p, unsigned int size);
+void kasan_check_write(const void *p, unsigned int size);
+#else
+static inline void kasan_check_read(const void *p, unsigned int size) { }
+static inline void kasan_check_write(const void *p, unsigned int size) { }
+#endif
+
+#endif
index e5beb40d97b1c90d3ddc4fc6c47c170060efcdf7..18b6a2b8d183550daa6c3e64ae7ba50610ead79c 100644 (file)
@@ -299,6 +299,18 @@ static void check_memory_region(unsigned long addr,
        check_memory_region_inline(addr, size, write, ret_ip);
 }
 
+void kasan_check_read(const void *p, unsigned int size)
+{
+       check_memory_region((unsigned long)p, size, false, _RET_IP_);
+}
+EXPORT_SYMBOL(kasan_check_read);
+
+void kasan_check_write(const void *p, unsigned int size)
+{
+       check_memory_region((unsigned long)p, size, true, _RET_IP_);
+}
+EXPORT_SYMBOL(kasan_check_write);
+
 #undef memset
 void *memset(void *addr, int c, size_t len)
 {