mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
kasan: fail non-kasan KUnit tests on KASAN reports
After the recent changes done to KUnit-enabled KASAN tests, non-KASAN KUnit tests stopped being failed when KASAN report is detected. Recover that property by failing the currently running non-KASAN KUnit test when KASAN detects and prints a report for a bad memory access. Note that if the bad accesses happened in a kernel thread that doesn't have a reference to the currently running KUnit-test available via current->kunit_test, the test won't be failed. This is a limitation of KUnit, which doesn't yet provide a thread-agnostic way to find the reference to the currenly running test. Link: https://lkml.kernel.org/r/7be29a8ea967cee6b7e48d3d5a242d1d0bd96851.1669820505.git.andreyknvl@google.com Fixes:49d9977ac9
("kasan: check CONFIG_KASAN_KUNIT_TEST instead of CONFIG_KUNIT") Fixes:7ce0ea19d5
("kasan: switch kunit tests to console tracepoints") Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Cc: Alexander Potapenko <glider@google.com> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com> Cc: David Gow <davidgow@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Marco Elver <elver@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
19fc1a7e8b
commit
c8c7016f50
@ -541,6 +541,18 @@ static inline bool kasan_arch_is_ready(void) { return true; }
|
||||
#error kasan_arch_is_ready only works in KASAN generic outline mode!
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_KASAN_KUNIT_TEST)
|
||||
|
||||
void kasan_kunit_test_suite_start(void);
|
||||
void kasan_kunit_test_suite_end(void);
|
||||
|
||||
#else /* CONFIG_KASAN_KUNIT_TEST */
|
||||
|
||||
static inline void kasan_kunit_test_suite_start(void) { }
|
||||
static inline void kasan_kunit_test_suite_end(void) { }
|
||||
|
||||
#endif /* CONFIG_KASAN_KUNIT_TEST */
|
||||
|
||||
#if IS_ENABLED(CONFIG_KASAN_KUNIT_TEST) || IS_ENABLED(CONFIG_KASAN_MODULE_TEST)
|
||||
|
||||
bool kasan_save_enable_multi_shot(void);
|
||||
|
@ -76,6 +76,9 @@ static int kasan_suite_init(struct kunit_suite *suite)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Stop failing KUnit tests on KASAN reports. */
|
||||
kasan_kunit_test_suite_start();
|
||||
|
||||
/*
|
||||
* Temporarily enable multi-shot mode. Otherwise, KASAN would only
|
||||
* report the first detected bug and panic the kernel if panic_on_warn
|
||||
@ -94,6 +97,7 @@ static int kasan_suite_init(struct kunit_suite *suite)
|
||||
|
||||
static void kasan_suite_exit(struct kunit_suite *suite)
|
||||
{
|
||||
kasan_kunit_test_suite_end();
|
||||
kasan_restore_multi_shot(multishot);
|
||||
for_each_kernel_tracepoint(unregister_tracepoints, NULL);
|
||||
tracepoint_synchronize_unregister();
|
||||
|
@ -9,6 +9,7 @@
|
||||
* Andrey Konovalov <andreyknvl@gmail.com>
|
||||
*/
|
||||
|
||||
#include <kunit/test.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/init.h>
|
||||
@ -112,10 +113,62 @@ EXPORT_SYMBOL_GPL(kasan_restore_multi_shot);
|
||||
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_KASAN_KUNIT_TEST)
|
||||
|
||||
/*
|
||||
* Whether the KASAN KUnit test suite is currently being executed.
|
||||
* Updated in kasan_test.c.
|
||||
*/
|
||||
bool kasan_kunit_executing;
|
||||
|
||||
void kasan_kunit_test_suite_start(void)
|
||||
{
|
||||
WRITE_ONCE(kasan_kunit_executing, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kasan_kunit_test_suite_start);
|
||||
|
||||
void kasan_kunit_test_suite_end(void)
|
||||
{
|
||||
WRITE_ONCE(kasan_kunit_executing, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kasan_kunit_test_suite_end);
|
||||
|
||||
static bool kasan_kunit_test_suite_executing(void)
|
||||
{
|
||||
return READ_ONCE(kasan_kunit_executing);
|
||||
}
|
||||
|
||||
#else /* CONFIG_KASAN_KUNIT_TEST */
|
||||
|
||||
static inline bool kasan_kunit_test_suite_executing(void) { return false; }
|
||||
|
||||
#endif /* CONFIG_KASAN_KUNIT_TEST */
|
||||
|
||||
#if IS_ENABLED(CONFIG_KUNIT)
|
||||
|
||||
static void fail_non_kasan_kunit_test(void)
|
||||
{
|
||||
struct kunit *test;
|
||||
|
||||
if (kasan_kunit_test_suite_executing())
|
||||
return;
|
||||
|
||||
test = current->kunit_test;
|
||||
if (test)
|
||||
kunit_set_failure(test);
|
||||
}
|
||||
|
||||
#else /* CONFIG_KUNIT */
|
||||
|
||||
static inline void fail_non_kasan_kunit_test(void) { }
|
||||
|
||||
#endif /* CONFIG_KUNIT */
|
||||
|
||||
static DEFINE_SPINLOCK(report_lock);
|
||||
|
||||
static void start_report(unsigned long *flags, bool sync)
|
||||
{
|
||||
fail_non_kasan_kunit_test();
|
||||
/* Respect the /proc/sys/kernel/traceoff_on_warning interface. */
|
||||
disable_trace_on_warning();
|
||||
/* Do not allow LOCKDEP mangling KASAN reports. */
|
||||
|
Loading…
Reference in New Issue
Block a user