All of lore.kernel.org
 help / color / mirror / Atom feed
From: andrey.konovalov@linux.dev
To: Marco Elver <elver@google.com>, Alexander Potapenko <glider@google.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Andrey Ryabinin <ryabinin.a.a@gmail.com>,
	kasan-dev@googlegroups.com,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Andrey Konovalov <andreyknvl@google.com>
Subject: [PATCH mm 15/22] kasan: call print_report from kasan_report_invalid_free
Date: Wed,  2 Mar 2022 17:36:35 +0100	[thread overview]
Message-ID: <9ea6f0604c5d2e1fb28d93dc6c44232c1f8017fe.1646237226.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1646237226.git.andreyknvl@google.com>

From: Andrey Konovalov <andreyknvl@google.com>

Call print_report() in kasan_report_invalid_free() instead of calling
printing functions directly. Compared to the existing implementation
of kasan_report_invalid_free(), print_report() makes sure that the
buggy address has metadata before printing it.

The change requires adding a report type field into kasan_access_info
and using it accordingly.

kasan_report_async() is left as is, as using print_report() will only
complicate the code.

Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
---
 mm/kasan/kasan.h  |  6 ++++++
 mm/kasan/report.c | 42 ++++++++++++++++++++++++++----------------
 2 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index 40b863e289ec..8c9a855152c2 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -127,7 +127,13 @@ static inline bool kasan_sync_fault_possible(void)
 #define META_MEM_BYTES_PER_ROW (META_BYTES_PER_ROW * KASAN_GRANULE_SIZE)
 #define META_ROWS_AROUND_ADDR 2
 
+enum kasan_report_type {
+	KASAN_REPORT_ACCESS,
+	KASAN_REPORT_INVALID_FREE,
+};
+
 struct kasan_access_info {
+	enum kasan_report_type type;
 	void *access_addr;
 	void *first_bad_addr;
 	size_t access_size;
diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 56d5ba235542..73348f83b813 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -86,6 +86,12 @@ __setup("kasan_multi_shot", kasan_set_multi_shot);
 
 static void print_error_description(struct kasan_access_info *info)
 {
+	if (info->type == KASAN_REPORT_INVALID_FREE) {
+		pr_err("BUG: KASAN: double-free or invalid-free in %pS\n",
+		       (void *)info->ip);
+		return;
+	}
+
 	pr_err("BUG: KASAN: %s in %pS\n",
 		kasan_get_bug_type(info), (void *)info->ip);
 	if (info->access_size)
@@ -386,22 +392,6 @@ static bool report_enabled(void)
 	return !test_and_set_bit(KASAN_BIT_REPORTED, &kasan_flags);
 }
 
-void kasan_report_invalid_free(void *object, unsigned long ip)
-{
-	unsigned long flags;
-	u8 tag = get_tag(object);
-
-	object = kasan_reset_tag(object);
-
-	start_report(&flags, true);
-	pr_err("BUG: KASAN: double-free or invalid-free in %pS\n", (void *)ip);
-	kasan_print_tags(tag, object);
-	pr_err("\n");
-	print_address_description(object, tag);
-	print_memory_metadata(object);
-	end_report(&flags, object);
-}
-
 #ifdef CONFIG_KASAN_HW_TAGS
 void kasan_report_async(void)
 {
@@ -435,6 +425,25 @@ static void print_report(struct kasan_access_info *info)
 	}
 }
 
+void kasan_report_invalid_free(void *ptr, unsigned long ip)
+{
+	unsigned long flags;
+	struct kasan_access_info info;
+
+	start_report(&flags, true);
+
+	info.type = KASAN_REPORT_INVALID_FREE;
+	info.access_addr = ptr;
+	info.first_bad_addr = kasan_reset_tag(ptr);
+	info.access_size = 0;
+	info.is_write = false;
+	info.ip = ip;
+
+	print_report(&info);
+
+	end_report(&flags, ptr);
+}
+
 bool kasan_report(unsigned long addr, size_t size, bool is_write,
 			unsigned long ip)
 {
@@ -451,6 +460,7 @@ bool kasan_report(unsigned long addr, size_t size, bool is_write,
 
 	start_report(&irq_flags, true);
 
+	info.type = KASAN_REPORT_ACCESS;
 	info.access_addr = ptr;
 	info.first_bad_addr = kasan_find_first_bad_addr(ptr, size);
 	info.access_size = size;
-- 
2.25.1


  parent reply	other threads:[~2022-03-02 16:39 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-02 16:36 [PATCH mm 00/22] kasan: report clean-ups and improvements andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 01/22] kasan: drop addr check from describe_object_addr andrey.konovalov
2022-03-02 17:27   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 02/22] kasan: more line breaks in reports andrey.konovalov
2022-03-02 17:28   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 03/22] kasan: rearrange stack frame info " andrey.konovalov
2022-03-02 17:29   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 04/22] kasan: improve " andrey.konovalov
2022-03-02 17:31   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 05/22] kasan: print basic stack frame info for SW_TAGS andrey.konovalov
2022-03-02 17:34   ` Alexander Potapenko
2022-03-08 14:09     ` Andrey Konovalov
2022-03-02 16:36 ` [PATCH mm 06/22] kasan: simplify async check in end_report andrey.konovalov
2022-03-02 17:37   ` Alexander Potapenko
2022-03-08 14:09     ` Andrey Konovalov
2022-03-02 16:36 ` [PATCH mm 07/22] kasan: simplify kasan_update_kunit_status and call sites andrey.konovalov
2022-03-02 17:46   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 08/22] kasan: check CONFIG_KASAN_KUNIT_TEST instead of CONFIG_KUNIT andrey.konovalov
2022-03-02 17:57   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 09/22] kasan: move update_kunit_status to start_report andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 10/22] kasan: move disable_trace_on_warning " andrey.konovalov
2022-03-02 18:00   ` Alexander Potapenko
2022-03-02 16:36 ` [PATCH mm 11/22] kasan: split out print_report from __kasan_report andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 12/22] kasan: simplify kasan_find_first_bad_addr call sites andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 13/22] kasan: restructure kasan_report andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 14/22] kasan: merge __kasan_report into kasan_report andrey.konovalov
2022-03-02 16:36 ` andrey.konovalov [this message]
2022-03-02 16:36 ` [PATCH mm 16/22] kasan: move and simplify kasan_report_async andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 17/22] kasan: rename kasan_access_info to kasan_report_info andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 18/22] kasan: add comment about UACCESS regions to kasan_report andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 19/22] kasan: respect KASAN_BIT_REPORTED in all reporting routines andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 20/22] kasan: reorder reporting functions andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 21/22] kasan: move and hide kasan_save_enable/restore_multi_shot andrey.konovalov
2022-03-02 16:36 ` [PATCH mm 22/22] kasan: disable LOCKDEP when printing reports 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=9ea6f0604c5d2e1fb28d93dc6c44232c1f8017fe.1646237226.git.andreyknvl@google.com \
    --to=andrey.konovalov@linux.dev \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@gmail.com \
    --cc=andreyknvl@google.com \
    --cc=dvyukov@google.com \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ryabinin.a.a@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.