[patch 094/173] kasan: adapt kmalloc_uaf2 test to HW_TAGS mode
STALE2045d
REVIEWED: 9 (9M)
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2021-02-24 20:05:42
Also in:
mm-commits
2 review trailers.
From: Andrey Konovalov <redacted> Subject: kasan: adapt kmalloc_uaf2 test to HW_TAGS mode In the kmalloc_uaf2() test, the pointers to the two allocated memory blocks might happen to be the same, and the test will fail. With the software tag-based mode, the probability of the that is 1/254, so it's hard to observe the failure. For the hardware tag-based mode though, the probablity is 1/14, which is quite noticable. Allow up to 16 attempts at generating different tags for the tag-based modes. Link: https://linux-review.googlesource.com/id/Ibfa458ef2804ff465d8eb07434a300bf36388d55 Link: https://lkml.kernel.org/r/9cd5cf2f633dcbf55cab801cd26845d2b075cec7.1610733117.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <redacted> Reviewed-by: Marco Elver <elver@google.com> Reviewed-by: Alexander Potapenko <glider@google.com> Cc: Andrey Ryabinin <redacted> Cc: Branislav Rankov <redacted> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Evgenii Stepanov <redacted> Cc: Kevin Brodsky <redacted> Cc: Peter Collingbourne <redacted> Cc: Vincenzo Frascino <vincenzo.frascino@arm.com> Cc: Will Deacon <redacted> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> --- lib/test_kasan.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
--- a/lib/test_kasan.c~kasan-adapt-kmalloc_uaf2-test-to-hw_tags-mode
+++ a/lib/test_kasan.c@@ -382,7 +382,9 @@ static void kmalloc_uaf2(struct kunit *t { char *ptr1, *ptr2; size_t size = 43; + int counter = 0; +again: ptr1 = kmalloc(size, GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
@@ -391,6 +393,15 @@ static void kmalloc_uaf2(struct kunit *t ptr2 = kmalloc(size, GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); + /* + * For tag-based KASAN ptr1 and ptr2 tags might happen to be the same. + * Allow up to 16 attempts at generating different tags. + */ + if (!IS_ENABLED(CONFIG_KASAN_GENERIC) && ptr1 == ptr2 && counter++ < 16) { + kfree(ptr2); + goto again; + } + KUNIT_EXPECT_KASAN_FAIL(test, ptr1[40] = 'x'); KUNIT_EXPECT_PTR_NE(test, ptr1, ptr2);
_