anolis: kfence: fit is_kfence_address() to KASAN at any path

ANBZ: #28

The function is_kfence_address() convert kaddr to page without checking
kaddr because it is valid in most common cases. But when KASAN enabled,
there may be invalid kaddr, called by kasan_record_aux_stack(),
kasan_poison_shadow(), kasan_unpoison_shadow(), etc.

Fixes: 2265a18d22 ("anolis: kfence: add PG_kfence to recognize kfence address in fast path")
Signed-off-by: Tianchen Ding <dtcccc@linux.alibaba.com>
Reviewed-by: Xunlei Pang <xlpang@linux.alibaba.com>
This commit is contained in:
Tianchen Ding 2022-03-11 10:20:55 +08:00 committed by Qiao Ma
parent 998efaf77b
commit fc58440f83
1 changed files with 11 additions and 0 deletions

View File

@ -76,7 +76,18 @@ static __always_inline bool is_kfence_address_area(const void *addr,
*/
static __always_inline bool is_kfence_address(const void *addr)
{
#ifdef CONFIG_KASAN
/*
* KASAN functions such as kasan_record_aux_stack(),
* kasan_poison_shadow(), or kasan_unpoison_shadow()
* may give an invalid kaddr (direct mapping kernel address).
* We must add a check here.
*/
return static_branch_unlikely(&kfence_once_inited) &&
virt_addr_valid(addr) && PageKfence(virt_to_page(addr));
#else
return static_branch_unlikely(&kfence_once_inited) && PageKfence(virt_to_page(addr));
#endif
}
/**