Christophe Leroy <christophe.le...@csgroup.eu> writes: > + KASAN list > > Le 06/10/2022 à 06:10, Michael Ellerman a écrit : >> Nathan Lynch <nath...@linux.ibm.com> writes: >>> 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; }