From: Andrey Ryabinin <aryabinin@virtuozzo.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Mark Rutland <mark.rutland@arm.com>,
Alexander Potapenko <glider@google.com>,
Dmitry Vyukov <dvyukov@google.com>,
kasan-dev@googlegroups.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Andrey Ryabinin <aryabinin@virtuozzo.com>
Subject: [PATCH] kasan: report only the first error
Date: Wed, 22 Mar 2017 19:06:47 +0300 [thread overview]
Message-ID: <20170322160647.32032-1-aryabinin@virtuozzo.com> (raw)
Disable kasan after the first report. There are several reasons for this:
* Single bug quite often has multiple invalid memory accesses causing
storm in the dmesg.
* Write OOB access might corrupt metadata so the next report will print
bogus alloc/free stacktraces.
* Reports after the first easily could be not bugs by itself but just side
effects of the first one.
Given that multiple reports only do harm, it makes sense to disable
kasan after the first one. Except for the tests in lib/test_kasan.c
as we obviously want to see all reports from test.
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---
lib/test_kasan.c | 9 +++++++++
mm/kasan/report.c | 7 +++++++
2 files changed, 16 insertions(+)
diff --git a/lib/test_kasan.c b/lib/test_kasan.c
index 0b1d314..5112663 100644
--- a/lib/test_kasan.c
+++ b/lib/test_kasan.c
@@ -11,6 +11,7 @@
#define pr_fmt(fmt) "kasan test: %s " fmt, __func__
+#include <linux/atomic.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/mman.h>
@@ -21,6 +22,8 @@
#include <linux/uaccess.h>
#include <linux/module.h>
+extern atomic_t kasan_report_count;
+
/*
* Note: test functions are marked noinline so that their names appear in
* reports.
@@ -474,6 +477,9 @@ static noinline void __init use_after_scope_test(void)
static int __init kmalloc_tests_init(void)
{
+ /* Rise reports limit high enough to see all the following bugs */
+ atomic_set(&kasan_report_count, 100);
+
kmalloc_oob_right();
kmalloc_oob_left();
kmalloc_node_oob_right();
@@ -499,6 +505,9 @@ static int __init kmalloc_tests_init(void)
ksize_unpoisons_memory();
copy_user_test();
use_after_scope_test();
+
+ /* kasan is unreliable now, disable reports */
+ atomic_set(&kasan_report_count, 0);
return -EAGAIN;
}
diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 718a10a..7eab229 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -13,6 +13,7 @@
*
*/
+#include <linux/atomic.h>
#include <linux/ftrace.h>
#include <linux/kernel.h>
#include <linux/mm.h>
@@ -354,6 +355,9 @@ static void kasan_report_error(struct kasan_access_info *info)
kasan_end_report(&flags);
}
+atomic_t kasan_report_count = ATOMIC_INIT(1);
+EXPORT_SYMBOL_GPL(kasan_report_count);
+
void kasan_report(unsigned long addr, size_t size,
bool is_write, unsigned long ip)
{
@@ -362,6 +366,9 @@ void kasan_report(unsigned long addr, size_t size,
if (likely(!kasan_report_enabled()))
return;
+ if (atomic_dec_if_positive(&kasan_report_count) < 0)
+ return;
+
disable_trace_on_warning();
info.access_addr = (void *)addr;
--
2.10.2
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next reply other threads:[~2017-03-22 16:07 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-22 16:06 Andrey Ryabinin [this message]
2017-03-22 16:34 ` [PATCH] kasan: report only the first error Andrey Konovalov
2017-03-22 16:54 ` Andrey Ryabinin
2017-03-22 17:07 ` Andrey Konovalov
2017-03-22 17:33 ` Alexander Potapenko
2017-03-22 17:42 ` Dmitry Vyukov
2017-03-23 11:49 ` [PATCH v2] kasan: report only the first error by default Andrey Ryabinin
2017-03-23 12:41 ` Mark Rutland
2017-03-23 13:06 ` Andrey Ryabinin
2017-03-23 13:29 ` Mark Rutland
2017-03-23 15:44 ` [PATCH v3] " Andrey Ryabinin
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=20170322160647.32032-1-aryabinin@virtuozzo.com \
--to=aryabinin@virtuozzo.com \
--cc=akpm@linux-foundation.org \
--cc=dvyukov@google.com \
--cc=glider@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@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;
as well as URLs for NNTP newsgroup(s).