summaryrefslogtreecommitdiffstats
path: root/lib/kasan
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kasan')
-rw-r--r--lib/kasan/Kconfig2
-rw-r--r--lib/kasan/Makefile1
-rw-r--r--lib/kasan/generic.c7
-rw-r--r--lib/kasan/report.c24
-rw-r--r--lib/kasan/test_kasan.c18
5 files changed, 35 insertions, 17 deletions
diff --git a/lib/kasan/Kconfig b/lib/kasan/Kconfig
index 7a18cf95be..e96638304c 100644
--- a/lib/kasan/Kconfig
+++ b/lib/kasan/Kconfig
@@ -1,4 +1,4 @@
-source "scripts/Kconfig.include"
+# SPDX-License-Identifier: GPL-2.0-only
config HAVE_ARCH_KASAN
bool
diff --git a/lib/kasan/Makefile b/lib/kasan/Makefile
index 31e9d890d5..e3f4bb61f9 100644
--- a/lib/kasan/Makefile
+++ b/lib/kasan/Makefile
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-only
obj-y += generic_report.o generic.o report.o common.o test_kasan.o
KASAN_SANITIZE_generic_report.o := n
diff --git a/lib/kasan/generic.c b/lib/kasan/generic.c
index b33a6c1a6c..3709b8da9a 100644
--- a/lib/kasan/generic.c
+++ b/lib/kasan/generic.c
@@ -14,14 +14,13 @@
*
*/
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
#include <common.h>
#include "kasan.h"
unsigned long kasan_shadow_start;
unsigned long kasan_shadow_base;
+unsigned long kasan_shadowed_end;
/*
* All functions below always inlined so compiler could
@@ -160,6 +159,9 @@ static __always_inline bool check_memory_region_inline(unsigned long addr,
if (addr < kasan_shadow_start)
return true;
+ if (addr > kasan_shadowed_end)
+ return true;
+
if (unlikely(size == 0))
return true;
@@ -180,6 +182,7 @@ void kasan_init(unsigned long membase, unsigned long memsize,
{
kasan_shadow_start = membase;
kasan_shadow_base = shadow_base;
+ kasan_shadowed_end = membase + memsize - 1;
kasan_unpoison_shadow((void *)membase, memsize);
kasan_initialized = true;
diff --git a/lib/kasan/report.c b/lib/kasan/report.c
index b7b2d032ee..a9050546e7 100644
--- a/lib/kasan/report.c
+++ b/lib/kasan/report.c
@@ -17,7 +17,7 @@
#include <common.h>
#include <linux/bitops.h>
#include <linux/kernel.h>
-#include <printk.h>
+#include <linux/printk.h>
#include <asm-generic/sections.h>
#include "kasan.h"
@@ -48,9 +48,9 @@ EXPORT_SYMBOL_GPL(kasan_restore_multi_shot);
static void print_error_description(struct kasan_access_info *info)
{
- pr_err("BUG: KASAN: %s in %pS\n",
+ eprintf("BUG: KASAN: %s in %pS\n",
get_bug_type(info), (void *)info->ip);
- pr_err("%s of size %zu at addr %px\n",
+ eprintf("%s of size %zu at addr %px\n",
info->is_write ? "Write" : "Read", info->access_size,
info->access_addr);
}
@@ -61,12 +61,12 @@ static void start_report(unsigned long *flags)
* Make sure we don't end up in loop.
*/
kasan_disable_current();
- pr_err("==================================================================\n");
+ eprintf("==================================================================\n");
}
static void end_report(unsigned long *flags)
{
- pr_err("==================================================================\n");
+ eprintf("==================================================================\n");
kasan_enable_current();
}
@@ -80,11 +80,11 @@ static inline bool kernel_or_module_addr(const void *addr)
static void print_address_description(void *addr, u8 tag)
{
dump_stack();
- pr_err("\n");
+ eprintf("\n");
if (kernel_or_module_addr(addr)) {
- pr_err("The buggy address belongs to the variable:\n");
- pr_err(" %pS\n", addr);
+ eprintf("The buggy address belongs to the variable:\n");
+ eprintf(" %pS\n", addr);
}
}
@@ -112,7 +112,7 @@ static void print_shadow_for_address(const void *addr)
SHADOW_BYTES_PER_ROW)
- SHADOW_ROWS_AROUND_ADDR * SHADOW_BYTES_PER_ROW;
- pr_err("Memory state around the buggy address:\n");
+ eprintf("Memory state around the buggy address:\n");
for (i = -SHADOW_ROWS_AROUND_ADDR; i <= SHADOW_ROWS_AROUND_ADDR; i++) {
const void *kaddr = kasan_shadow_to_mem(shadow_row);
@@ -132,7 +132,7 @@ static void print_shadow_for_address(const void *addr)
shadow_buf, SHADOW_BYTES_PER_ROW, 0);
if (row_is_guilty(shadow_row, shadow))
- printf("%*c\n",
+ eprintf("%*c\n",
shadow_pointer_offset(shadow_row, shadow),
'^');
@@ -172,11 +172,11 @@ static void __kasan_report(unsigned long addr, size_t size, bool is_write,
start_report(&flags);
print_error_description(&info);
- pr_err("\n");
+ eprintf("\n");
if (addr_has_shadow(untagged_addr)) {
print_address_description(untagged_addr, get_tag(tagged_addr));
- pr_err("\n");
+ eprintf("\n");
print_shadow_for_address(info.first_bad_addr);
} else {
dump_stack();
diff --git a/lib/kasan/test_kasan.c b/lib/kasan/test_kasan.c
index e472bb3499..bacc02b56e 100644
--- a/lib/kasan/test_kasan.c
+++ b/lib/kasan/test_kasan.c
@@ -38,6 +38,8 @@ static noinline void malloc_oob_right(void)
return;
}
+ OPTIMIZER_HIDE_VAR(ptr);
+
ptr[size] = 'x';
free(ptr);
@@ -55,6 +57,8 @@ static noinline void malloc_oob_left(void)
return;
}
+ OPTIMIZER_HIDE_VAR(ptr);
+
*ptr = *(ptr - 1);
free(ptr);
}
@@ -65,7 +69,7 @@ static noinline void malloc_oob_realloc_more(void)
size_t size1 = 17;
size_t size2 = 19;
- pr_info("out-of-bounds after krealloc more\n");
+ pr_info("out-of-bounds after realloc more\n");
ptr1 = malloc(size1);
ptr2 = realloc(ptr1, size2);
if (!ptr1 || !ptr2) {
@@ -75,6 +79,8 @@ static noinline void malloc_oob_realloc_more(void)
return;
}
+ OPTIMIZER_HIDE_VAR(ptr2);
+
ptr2[size2] = 'x';
free(ptr2);
@@ -86,7 +92,7 @@ static noinline void malloc_oob_realloc_less(void)
size_t size1 = 17;
size_t size2 = 15;
- pr_info("out-of-bounds after krealloc less\n");
+ pr_info("out-of-bounds after realloc less\n");
ptr1 = malloc(size1);
ptr2 = realloc(ptr1, size2);
if (!ptr1 || !ptr2) {
@@ -95,6 +101,8 @@ static noinline void malloc_oob_realloc_less(void)
return;
}
+ OPTIMIZER_HIDE_VAR(ptr2);
+
ptr2[size2] = 'x';
free(ptr2);
@@ -115,6 +123,9 @@ static noinline void malloc_oob_16(void)
free(ptr2);
return;
}
+
+ OPTIMIZER_HIDE_VAR(ptr1);
+
*ptr1 = *ptr2;
free(ptr1);
free(ptr2);
@@ -290,6 +301,8 @@ static noinline void kasan_alloca_oob_left(void)
char alloca_array[i];
char *p = alloca_array - 1;
+ OPTIMIZER_HIDE_VAR(p);
+
pr_info("out-of-bounds to left on alloca\n");
*(volatile char *)p;
}
@@ -474,5 +487,6 @@ static int do_kasan_test(int argc, char *argv[])
BAREBOX_CMD_START(kasan_tests)
.cmd = do_kasan_test,
BAREBOX_CMD_DESC("Run KAsan tests")
+ BAREBOX_CMD_GROUP(CMD_GRP_MISC)
BAREBOX_CMD_COMPLETE(empty_complete)
BAREBOX_CMD_END