kasan: only apply __GFP_ZEROTAGS when memory is zeroed
authorAndrey Konovalov <andreyknvl@google.com>
Fri, 25 Mar 2022 01:10:25 +0000 (18:10 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Mar 2022 02:06:46 +0000 (19:06 -0700)
__GFP_ZEROTAGS should only be effective if memory is being zeroed.
Currently, hardware tag-based KASAN violates this requirement.

Fix by including an initialization check along with checking for
__GFP_ZEROTAGS.

Link: https://lkml.kernel.org/r/f4f4593f7f675262d29d07c1938db5bd0cd5e285.1643047180.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Reviewed-by: Alexander Potapenko <glider@google.com>
Acked-by: Marco Elver <elver@google.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Evgenii Stepanov <eugenis@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Collingbourne <pcc@google.com>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/kasan/hw_tags.c

index 0b8225add2e489b5f08894161bf71b067775636b..c643740b8599694116905436cf58b4f1dd1259b1 100644 (file)
@@ -199,11 +199,12 @@ void kasan_alloc_pages(struct page *page, unsigned int order, gfp_t flags)
         * page_alloc.c.
         */
        bool init = !want_init_on_free() && want_init_on_alloc(flags);
+       bool init_tags = init && (flags & __GFP_ZEROTAGS);
 
        if (flags & __GFP_SKIP_KASAN_POISON)
                SetPageSkipKASanPoison(page);
 
-       if (flags & __GFP_ZEROTAGS) {
+       if (init_tags) {
                int i;
 
                for (i = 0; i != 1 << order; ++i)