Messages in this thread Patch in this message | | | Date | Fri, 19 Jul 2019 15:28:18 +0200 | Subject | [PATCH 2/2] lib/test_kasan: Add stack overflow test | From | Marco Elver <> |
| |
Adds a simple stack overflow test, to check the error being reported on an overflow. Without CONFIG_STACK_GUARD_PAGE, the result is typically some seemingly unrelated KASAN error message due to accessing random other memory.
Signed-off-by: Marco Elver <elver@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Alexander Potapenko <glider@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Andrey Konovalov <andreyknvl@google.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org Cc: kasan-dev@googlegroups.com --- lib/test_kasan.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
diff --git a/lib/test_kasan.c b/lib/test_kasan.c index b63b367a94e8..3092ec01189d 100644 --- a/lib/test_kasan.c +++ b/lib/test_kasan.c @@ -15,6 +15,7 @@ #include <linux/mman.h> #include <linux/module.h> #include <linux/printk.h> +#include <linux/sched/task_stack.h> #include <linux/slab.h> #include <linux/string.h> #include <linux/uaccess.h> @@ -709,6 +710,32 @@ static noinline void __init kmalloc_double_kzfree(void) kzfree(ptr); } +#ifdef CONFIG_STACK_GUARD_PAGE +static noinline void __init stack_overflow_via_recursion(void) +{ + volatile int n = 512; + + BUILD_BUG_ON(IS_ENABLED(CONFIG_STACK_GROWSUP)); + + /* About to overflow: overflow via alloca'd array and try to write. */ + if (!object_is_on_stack((void *)&n - n)) { + volatile char overflow[n]; + + overflow[0] = overflow[0]; + return; + } + + stack_overflow_via_recursion(); +} + +static noinline void __init kasan_stack_overflow(void) +{ + pr_info("stack overflow begin\n"); + stack_overflow_via_recursion(); + pr_info("stack overflow end\n"); +} +#endif + static int __init kmalloc_tests_init(void) { /* @@ -753,6 +780,15 @@ static int __init kmalloc_tests_init(void) kasan_bitops(); kmalloc_double_kzfree(); +#ifdef CONFIG_STACK_GUARD_PAGE + /* + * Only test with CONFIG_STACK_GUARD_PAGE, as without we get other + * random KASAN violations, due to accessing other random memory (we + * want to avoid actually corrupting memory in these tests). + */ + kasan_stack_overflow(); +#endif + kasan_restore_multi_shot(multishot); return -EAGAIN; -- 2.22.0.657.g960e92d24f-goog
| |