From: Andrey Konovalov <andreyknvl@google.com>
To: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>,
kasan-dev@googlegroups.com, Dmitry Vyukov <dvyukov@google.com>,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Alexander Potapenko <glider@google.com>,
Marco Elver <elver@google.com>,
Evgenii Stepanov <eugenis@google.com>,
Elena Petrova <lenaptr@google.com>,
Branislav Rankov <Branislav.Rankov@arm.com>,
Kevin Brodsky <kevin.brodsky@arm.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Andrey Konovalov <andreyknvl@google.com>
Subject: [PATCH v6 21/40] kasan: hide invalid free check implementation
Date: Thu, 29 Oct 2020 20:25:42 +0100 [thread overview]
Message-ID: <dd5676faa3c92874d90f486df253cace3c05641e.1603999489.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1603999489.git.andreyknvl@google.com>
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
For software KASAN modes the check is based on the value in the shadow
memory. Hardware tag-based KASAN won't be using shadow, so hide the
implementation of the check in check_invalid_free().
Also simplify the code for software tag-based mode.
No functional changes for software modes.
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Reviewed-by: Marco Elver <elver@google.com>
---
Change-Id: I5fae9531c9fc948eb4d4e0c589744032fc5a0789
---
mm/kasan/common.c | 19 +------------------
mm/kasan/generic.c | 7 +++++++
mm/kasan/kasan.h | 2 ++
mm/kasan/sw_tags.c | 9 +++++++++
4 files changed, 19 insertions(+), 18 deletions(-)
diff --git a/mm/kasan/common.c b/mm/kasan/common.c
index 123abfb760d4..543e6bf2168f 100644
--- a/mm/kasan/common.c
+++ b/mm/kasan/common.c
@@ -272,25 +272,9 @@ void * __must_check kasan_init_slab_obj(struct kmem_cache *cache,
return (void *)object;
}
-static inline bool shadow_invalid(u8 tag, s8 shadow_byte)
-{
- if (IS_ENABLED(CONFIG_KASAN_GENERIC))
- return shadow_byte < 0 ||
- shadow_byte >= KASAN_GRANULE_SIZE;
-
- /* else CONFIG_KASAN_SW_TAGS: */
- if ((u8)shadow_byte == KASAN_TAG_INVALID)
- return true;
- if ((tag != KASAN_TAG_KERNEL) && (tag != (u8)shadow_byte))
- return true;
-
- return false;
-}
-
static bool __kasan_slab_free(struct kmem_cache *cache, void *object,
unsigned long ip, bool quarantine)
{
- s8 shadow_byte;
u8 tag;
void *tagged_object;
unsigned long rounded_up_size;
@@ -309,8 +293,7 @@ static bool __kasan_slab_free(struct kmem_cache *cache, void *object,
if (unlikely(cache->flags & SLAB_TYPESAFE_BY_RCU))
return false;
- shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object));
- if (shadow_invalid(tag, shadow_byte)) {
+ if (check_invalid_free(tagged_object)) {
kasan_report_invalid_free(tagged_object, ip);
return true;
}
diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
index ec4417156943..e1af3b6c53b8 100644
--- a/mm/kasan/generic.c
+++ b/mm/kasan/generic.c
@@ -187,6 +187,13 @@ bool check_memory_region(unsigned long addr, size_t size, bool write,
return check_memory_region_inline(addr, size, write, ret_ip);
}
+bool check_invalid_free(void *addr)
+{
+ s8 shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(addr));
+
+ return shadow_byte < 0 || shadow_byte >= KASAN_GRANULE_SIZE;
+}
+
void kasan_cache_shrink(struct kmem_cache *cache)
{
quarantine_remove_cache(cache);
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index a2e71818d464..325bfd82bce4 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -164,6 +164,8 @@ void kasan_poison_memory(const void *address, size_t size, u8 value);
bool check_memory_region(unsigned long addr, size_t size, bool write,
unsigned long ret_ip);
+bool check_invalid_free(void *addr);
+
void *find_first_bad_addr(void *addr, size_t size);
const char *get_bug_type(struct kasan_access_info *info);
diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c
index 4bdd7dbd6647..b2638c2cd58a 100644
--- a/mm/kasan/sw_tags.c
+++ b/mm/kasan/sw_tags.c
@@ -121,6 +121,15 @@ bool check_memory_region(unsigned long addr, size_t size, bool write,
return true;
}
+bool check_invalid_free(void *addr)
+{
+ u8 tag = get_tag(addr);
+ u8 shadow_byte = READ_ONCE(*(u8 *)kasan_mem_to_shadow(reset_tag(addr)));
+
+ return (shadow_byte == KASAN_TAG_INVALID) ||
+ (tag != KASAN_TAG_KERNEL && tag != shadow_byte);
+}
+
#define DEFINE_HWASAN_LOAD_STORE(size) \
void __hwasan_load##size##_noabort(unsigned long addr) \
{ \
--
2.29.1.341.ge80a0c044ae-goog
next prev parent reply other threads:[~2020-10-29 19:27 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-29 19:25 [PATCH v6 00/40] kasan: add hardware tag-based mode for arm64 Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 01/40] arm64: Enable armv8.5-a asm-arch option Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 02/40] arm64: mte: Add in-kernel MTE helpers Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 03/40] arm64: mte: Reset the page tag in page->flags Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 04/40] arm64: kasan: Add arch layer for memory tagging helpers Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 05/40] arm64: mte: Add in-kernel tag fault handler Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 06/40] arm64: kasan: Enable in-kernel MTE Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 07/40] arm64: mte: Convert gcr_user into an exclude mask Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 08/40] arm64: mte: Switch GCR_EL1 in kernel entry and exit Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 09/40] arm64: kasan: Align allocations for HW_TAGS Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 10/40] kasan: drop unnecessary GPL text from comment headers Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 11/40] kasan: KASAN_VMALLOC depends on KASAN_GENERIC Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 12/40] kasan: group vmalloc code Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 13/40] kasan: shadow declarations only for software modes Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 14/40] kasan: rename (un)poison_shadow to (un)poison_memory Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 15/40] kasan: rename KASAN_SHADOW_* to KASAN_GRANULE_* Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 16/40] kasan: only build init.c for software modes Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 17/40] kasan: split out shadow.c from common.c Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 18/40] kasan: define KASAN_GRANULE_PAGE Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 19/40] kasan: rename report and tags files Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 20/40] kasan: don't duplicate config dependencies Andrey Konovalov
2020-10-29 19:25 ` Andrey Konovalov [this message]
2020-10-29 19:25 ` [PATCH v6 22/40] kasan: decode stack frame only with KASAN_STACK_ENABLE Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 23/40] kasan, arm64: only init shadow for software modes Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 24/40] kasan, arm64: only use kasan_depth " Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 25/40] kasan: rename addr_has_shadow to addr_has_metadata Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 26/40] kasan: rename print_shadow_for_address to print_memory_metadata Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 27/40] kasan: kasan_non_canonical_hook only for software modes Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 28/40] kasan: rename SHADOW layout macros to META Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 29/40] kasan: separate metadata_fetch_row for each mode Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 30/40] kasan, arm64: don't allow SW_TAGS with ARM64_MTE Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 31/40] kasan: introduce CONFIG_KASAN_HW_TAGS Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 32/40] kasan: define KASAN_GRANULE_SIZE for HW_TAGS Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 33/40] kasan, x86, s390: update undef CONFIG_KASAN Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 34/40] kasan, arm64: expand CONFIG_KASAN checks Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 35/40] kasan, arm64: implement HW_TAGS runtime Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 36/40] kasan, arm64: print report from tag fault handler Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 37/40] kasan, mm: reset tags when accessing metadata Andrey Konovalov
2020-10-29 19:25 ` [PATCH v6 38/40] kasan, arm64: enable CONFIG_KASAN_HW_TAGS Andrey Konovalov
2020-10-29 19:26 ` [PATCH v6 39/40] kasan: add documentation for hardware tag-based mode Andrey Konovalov
2020-10-29 19:26 ` [PATCH v6 40/40] kselftest/arm64: Check GCR_EL1 after context switch Andrey Konovalov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=dd5676faa3c92874d90f486df253cace3c05641e.1603999489.git.andreyknvl@google.com \
--to=andreyknvl@google.com \
--cc=Branislav.Rankov@arm.com \
--cc=akpm@linux-foundation.org \
--cc=aryabinin@virtuozzo.com \
--cc=catalin.marinas@arm.com \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=eugenis@google.com \
--cc=glider@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=kevin.brodsky@arm.com \
--cc=lenaptr@google.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=vincenzo.frascino@arm.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox