From 233bd5b929aebf1dbddaf538eacbf0e084daf388 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Thu, 31 Dec 2020 22:04:37 +0000 Subject: [PATCH] revert kasan-remove-kfence-leftovers Signed-off-by: Marco Elver Signed-off-by: Alexander Potapenko Signed-off-by: Andrew Morton --- mm/kasan/kasan.h | 9 +++++++++ mm/kasan/shadow.c | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index cc4d9e1d49b1..725a472e8ea7 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -3,6 +3,7 @@ #define __MM_KASAN_KASAN_H #include +#include #include #ifdef CONFIG_KASAN_HW_TAGS @@ -304,12 +305,20 @@ static inline u8 random_tag(void) { return 0; } static inline void poison_range(const void *address, size_t size, u8 value) { + /* Skip KFENCE memory if called explicitly outside of sl*b. */ + if (is_kfence_address(address)) + return; + hw_set_mem_tag_range(kasan_reset_tag(address), round_up(size, KASAN_GRANULE_SIZE), value); } static inline void unpoison_range(const void *address, size_t size) { + /* Skip KFENCE memory if called explicitly outside of sl*b. */ + if (is_kfence_address(address)) + return; + hw_set_mem_tag_range(kasan_reset_tag(address), round_up(size, KASAN_GRANULE_SIZE), get_tag(address)); } diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c index 7c2c08c55f32..e9efe88f7679 100644 --- a/mm/kasan/shadow.c +++ b/mm/kasan/shadow.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -84,6 +85,10 @@ void poison_range(const void *address, size_t size, u8 value) address = kasan_reset_tag(address); size = round_up(size, KASAN_GRANULE_SIZE); + /* Skip KFENCE memory if called explicitly outside of sl*b. */ + if (is_kfence_address(address)) + return; + shadow_start = kasan_mem_to_shadow(address); shadow_end = kasan_mem_to_shadow(address + size); @@ -101,6 +106,14 @@ void unpoison_range(const void *address, size_t size) */ address = kasan_reset_tag(address); + /* + * Skip KFENCE memory if called explicitly outside of sl*b. Also note + * that calls to ksize(), where size is not a multiple of machine-word + * size, would otherwise poison the invalid portion of the word. + */ + if (is_kfence_address(address)) + return; + poison_range(address, size, tag); if (size & KASAN_GRANULE_MASK) { -- 2.50.1