Re: [PATCH] powerpc/kasan/book3s_64: warn when running with hash MMU
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2022-10-07 10:42:21
Subsystem:
kasan, memory management, the rest · Maintainers:
Andrey Ryabinin, Andrew Morton, Linus Torvalds
Christophe Leroy [off-list ref] writes:
+ KASAN list Le 06/10/2022 à 06:10, Michael Ellerman a écrit :quoted
Nathan Lynch [off-list ref] writes:quoted
kasan is known to crash at boot on book3s_64 with non-radix MMU. As noted in commit 41b7a347bf14 ("powerpc: Book3S 64-bit outline-only KASAN support"): A kernel with CONFIG_KASAN=y will crash during boot on a machine using HPT translation because not all the entry points to the generic KASAN code are protected with a call to kasan_arch_is_ready().I guess I thought there was some plan to fix that.I was thinking the same. Do we have a list of the said entry points to the generic code that are lacking a call to kasan_arch_is_ready() ? Typically, the BUG dump below shows that kasan_byte_accessible() is lacking the check. It should be straight forward to add kasan_arch_is_ready() check to kasan_byte_accessible(), shouldn't it ?
Yes :) And one other spot, but the patch below boots OK for me. I'll leave it running for a while just in case there's a path I've missed. cheers
diff --git a/mm/kasan/common.c b/mm/kasan/common.c
index 69f583855c8b..5def0118f2cd 100644
--- a/mm/kasan/common.c
+++ b/mm/kasan/common.c@@ -377,6 +377,9 @@ bool __kasan_slab_free(struct kmem_cache *cache, void *object, static inline bool ____kasan_kfree_large(void *ptr, unsigned long ip) { + if (!kasan_arch_is_ready()) + return false; + if (ptr != page_address(virt_to_head_page(ptr))) { kasan_report_invalid_free(ptr, ip, KASAN_REPORT_INVALID_FREE); return true;
diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
index 437fcc7e77cf..017d3c69e3b3 100644
--- a/mm/kasan/generic.c
+++ b/mm/kasan/generic.c@@ -191,7 +191,12 @@ bool kasan_check_range(unsigned long addr, size_t size, bool write, bool kasan_byte_accessible(const void *addr) { - s8 shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(addr)); + s8 shadow_byte; + + if (!kasan_arch_is_ready()) + return true; + + shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(addr)); return shadow_byte >= 0 && shadow_byte < KASAN_GRANULE_SIZE; }