Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755245AbdCWLs3 (ORCPT ); Thu, 23 Mar 2017 07:48:29 -0400 Received: from mail-eopbgr00136.outbound.protection.outlook.com ([40.107.0.136]:20929 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751490AbdCWLsZ (ORCPT ); Thu, 23 Mar 2017 07:48:25 -0400 Authentication-Results: linux-foundation.org; dkim=none (message not signed) header.d=none;linux-foundation.org; dmarc=none action=none header.from=virtuozzo.com; From: Andrey Ryabinin To: Andrew Morton CC: Andrey Konovalov , Mark Rutland , Alexander Potapenko , Dmitry Vyukov , , , , Andrey Ryabinin Subject: [PATCH v2] kasan: report only the first error by default Date: Thu, 23 Mar 2017 14:49:16 +0300 Message-ID: <20170323114916.29871-1-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20170322160647.32032-1-aryabinin@virtuozzo.com> References: <20170322160647.32032-1-aryabinin@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: AM5PR0101CA0016.eurprd01.prod.exchangelabs.com (10.169.240.26) To VI1PR0801MB2061.eurprd08.prod.outlook.com (10.173.74.146) X-MS-Office365-Filtering-Correlation-Id: 14e5286c-ce66-4966-aabb-08d471e27ae7 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0801MB2061; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2061;3:+0FX7qgAJUyJSZEbTU0qmqZkzPQXah3Io/xY/ZxdllFTU/0F1DrWJcyDMdv20B0CvBug90UkYjPGwfMO6/jY08RQIyirw36EReGsawY2pm/prGqzzo+SpGsMI35YajLr8fI4jIxIXVjr5BzkRaBrSz0SC29MmetigM9uT6hrdDwb1e2RaKRvfv6Rf9gwykT+WJTGho+qPjFrQVsfabhlQiKHQxs87tV/gePTAfUOG40jWN48BOfib71q5KTcGbf+jyyo3lTcnlRLp9eWWZw/sQ==;25:OMbf/E0wds2hKjXksNszKZ/3jh2oksizhtf7JBmueF7OFROc49iefgfompnSxbVyBsuTG4tdSqtwOg/j1bAM0KWz9c0R79TKP73SjWCHwifFQ2HXnzMMqVhD0CQ/9T+PxqDsQvPx4ggzBEOWP8rQAH2Wmeqs59/mH1NPdzziwH22nflENFhHxSCDj3E3HGApa55lLC0gdFgF3Lu37RfeOMZIg22qHcOwwSnyOfttU0WD9ygfQWxOKF6TB/2rqdBbsyuMjhUwzn3CRD4Rrfu95omhQw+45iDgcBLtd1eeBU4JR4YTaLeEBYDVrpeHFIz10WVaw7MzB3lC7Ek+/wpywfVA4mBkGcAZnO5/6HAVzbR6n0dBStEZq82Ucu+i8puPLq0ea1jYcBumjWQ+Nv2HkqF9O7jZTg9pr7/i9+ponzmFb0uX+KqiMIPFmbbUwlokdu89ffygUT9LXhS90tLpkg== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2061;31:UkYDmAKu5uBR+LFr0WIy9jl0RS9bXeEN5qs90XBzPXylZsH+5fKIKgHqYDP5OI9piW7vpGoMGnpvAwf+ovGzhnipsqyk3RqRlpKChIxHlETGVyA1hEvOBVT323GNfvSKo/vdAbUTFzig9pKSEUfnRTHr5P0exbHM1iU7xT3w5yYrDY+DQzZCNELb7MTgL5RYTKnVhkZhpWAPNs2CB8SCyYW3JN6HKx3N30wBTzht74ioQUxTkvKSDhx2NqJDwXC5;20:ClluqjyaVag+6S6y/iTH3GzXvijJIne3tPz4BCSv2qL46Isx5uYWTE2JRm+v1oNyBS2wmcIxMMDqAhKiDgEKTP6xfktAWROXrVN4gTei6vmEsbniwDzO1yn5smu1UKO4mES88YFmM23yrN55iAjhp3r254HtSD8QfXIM3O5ECmH0lBTXRRoywsych4iU8ftrwKT3lWjUV4LvnnHmqgofQ0rJQelh7NMRZcIAz1WbGh8t+DJs8Je1JK6Z1+zF07SbsbdSz5frf6p6HpJ+fEZszenvhlMGogq8ufDAqmhfyiO8SbnF4EStn+p9Nk2Lsp8TVatoVw1Uszy6LTmSGdQXbmj1ZHZ5u1xiD/JVGFGLKiIS5d14d+m8g2s/W5KhsXTVrbdEjovu6QufY9yfED+flBpSSoXZKsa+8IONH+8WpQA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(20558992708506); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123558025)(20161123564025)(20161123560025)(20161123555025)(20161123562025)(6072148);SRVR:VI1PR0801MB2061;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB2061; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2061;4:Ko6LiFHNu2ChGmHTLHM9X/+BurNQQN0Q5zV4MsRfjub4DLFLHWrsHTMPiiDLpTU6FuBtwZ6X8ko/3+/IstyWdWgxEWdQl91p2/XCxEyQphhHcjjFwN5VZ3r44R5YN3c9TUpwPnmAVVa8JkL8z8WbzWeIBotMfKxMMXCMA9/mwbpRLsxDTi7ucn9MCv6hv0Cm5g8qaCA1tky/394PcPbIb4llUNg9s+xrBe9byMshwCOKLRa9h/DWGJOEvxDseFUQi/+lN7Jmrc2N9gwauEf/U1xIGhCT+nHIn6arT63fKcVKDvB88Hvgl8qV0EUop668gccmoR96i4WGMLmE4nKHIHDp+CKdvvTe5EdsDr4ChRaPmI4LgCo/8dVJJzuCxqwiJSKYGveZPLyMY4oEAYRM8eUeXDlMp0qsaPB6in4TfHWOYMoYkS3JEfbmdTP2p2OzAgFacdkdEMI34VZRBhxGc0NjksduG5sUBHrR3GIPHQXLnV5MUYhuxCFzN9wLYebCy178M7/nb7ahbVTG4dPn5O3ZiWrBr87r9ITXsbFd6IE4Iigne26CYKxAOo5c1ZEfydioYREjg94+BeoJNOvGV94Glb/7ugceKTAWZRNn+IDN/blGHL9IWUKcr6Dtb9h/dCK2sOKqCbX7cO5cf6buHw== X-Forefront-PRVS: 0255DF69B9 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6069001)(6009001)(39450400003)(6666003)(33646002)(107886003)(6116002)(6916009)(6512007)(54906002)(189998001)(25786009)(6506006)(5003940100001)(76176999)(4326008)(5660300001)(305945005)(6486002)(1076002)(2950100002)(3846002)(53416004)(48376002)(86362001)(66066001)(81166006)(42186005)(7736002)(50986999)(76506005)(8676002)(110136004)(2906002)(36756003)(38730400002)(50226002)(47776003)(50466002)(53936002);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB2061;H:localhost.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR0801MB2061;23:ncozw1+LmQtcQvqLDiueAVP8hKr743DzS8+Qomb?= =?us-ascii?Q?7DwsWhu9ydkd2k/GNrcPwsYfWhL8XkktvhAGPuh55Kc+PjW2cqw3EbcogPwo?= =?us-ascii?Q?7AuJchWSNujgLvNfJrykHj2SIn/QhIX/3ALwkSvvnvMa5cZvntLCH3tQK3D0?= =?us-ascii?Q?3Rby2rNUqqOsqLZmBHVBnmzvhDzbsrdsp/UDaYqs+XPvxyb9/n8JNEP+yNXU?= =?us-ascii?Q?NkBiP5ft16cmSt9OEYyjD8KUVk9zmPzCHKXhCEG2LV07TOqeTl/kXXcQ2P9H?= =?us-ascii?Q?NVnrM0mQem/2+o1sxq1F1oa1RxR0UNU+Pd+TZUOTwj697lUPTXtaQXs0xeNb?= =?us-ascii?Q?inQxDtcamUP4yYWWY7EFWtSv8e1cNnI8dNyPEaaMuBXOxscdq90hFhoj+iSK?= =?us-ascii?Q?SUsvpGHN75LBfi8M+DM07J1SgGT5UMlS2pjoZc9BC0bS12Ugpuv/JYhSPy0n?= =?us-ascii?Q?OJaNlZpKgs4OlQhjpCFoZGusSw8h0gPPt2wpz28KK6nNb6yWz8fBxLb/j6Y6?= =?us-ascii?Q?JVJOJnjk5fU8jSj80Nj4EZmL4oXweoAmAchK/qzNatcWEGKQbzoPaXo10YXQ?= =?us-ascii?Q?n6j7a2TrNBJy8xLDRRLlcvXSOnQvHF1T4DnCnL1ycPL7nmR2rf5kNK37VTdg?= =?us-ascii?Q?YRzwx/BGTSWInX3cknoaNcGD/S2TSx+BePGNzN2yzxk6tQFkFK4JGmyk4cLm?= =?us-ascii?Q?pL7UJvN13vVZ1TwuazdFLGqrwJbnHO5D2QAMjQ++wqV49XNnnyIyXv9iBxdb?= =?us-ascii?Q?BXTx+3R1JbtfSj6E74AAyGOESOPxZwzRCwURlcqJDCue3gJ38ctV8EP4vRLZ?= =?us-ascii?Q?6gTI5LdDyrC8PTArMHrcygSy0ol0v35mwokmoQnZ2JRru8nRBGKfxUiV+Xht?= =?us-ascii?Q?NxaYmjR/XfmPQYyLHcQWdRcXQysUzP9QmHbW0PHmMJMKX/6gc8R+tjyhc0Nw?= =?us-ascii?Q?SVL9nr2ffM/Sy4yo2ZJjHUS1LkfggYyVBXymllDmEFFl/Ng40KcJpirCD9I/?= =?us-ascii?Q?vlubK4sn3yQiCVyNN1EcrwzUL?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2061;6:R2/mdnkHcILaK2s9pncvuskVMVUxOOiLSYGsThi0EuSxJThV7EuMT3DqeNWgZI1c9u+VOxMudm8oJ+0T7rmyuHcDtqsC0ek33qDcPU3+7VnrQLDw4uueOUz6jiFIcIL6u1vCyvASHK4IoLX0MfmNVv67+gdC5B3adJMLiumK++0AE7FC2qtjurmYyMs7cLyH2NGQ7du4y/+aCM3fOdHS4e42CabGLohnq/4PYn7QY+SWIunDnZKtyIQCjfPKNocUlg5bqBOMw+4BjERKHTXeqtS3G1EYD//qc6Gkh06yjxLi7FMW9mNp4TVUokWYEmzxr0ZTQ4fE6tF+UnDyAmMjKA8Bdle2hrDBztdVMkKbJDxN40i5c0wcDbiU8e4rgeDdX2Ig685O7jHMn+B5dJiNzQ==;5:9dgXdPym4oPmNkckTlqKl3mVfYzwN1gcyhtKuI9l0YTwZif8169PsQyDYDR6MUBx+Lia01skqto2CnDcxeIXLA6+DgPh/ezKwuzfTXNAma8QS6ka66SMBR63gS4Ly//5j568GK7c5M4fPVg7wbyPqQ==;24:M3AGQnJFDTrTyzlVK6NDz3nnkLuVvQan1qPCTyXcFQ50eGy7bzTaGcZi1fq/RPeGUCOiM79/MsggvsCgA3mwsURa7WuTWH/RB71yb0lBetM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2061;7:D7XjIo+GzmMcj3wnzYQG7ceh9oh0MVrEMHARTogBSX7CdJyug424ImErngfyE9fjkkeJxSgBX/I08vTXQcqPX2r8hjGsGIh2EsBKG5eZUh3yp3SZh+Gyu3zuZWpkGySSB0r8Qhs9MyhXu0Ps+1Fk8Y0ifPopXu0SD1PERQ8FKt8MjMvYCRpbZc7nwxWZpfBCD0KGcISuJjLuEOMssCftmCFVTHoqVXfpGyeWOnH6FI3SwaBugqQP1iJZDeJnQRq87952P+INcCilkHrAlc2Po+cLKIv88s/VK340YK86odWTFYdduj1NHjSyXskChcl0d5pT7U+vpl11ElMPgp4obg==;20:6EOePnLhdhe3KfMngS1bIUYuqnjczEI4LToyB05E+03rj64+Mw2ySDJaLcVyrSjNU2tqUI0sAZEx+/Pvn25mhjQGwsAb7iRhqnjSxRDaUly04r1rdI7wiXDkAHDh56JYAjsNgwo6spTsggBUANbqoZO6sjL46SOcWrlCgQ756G8= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2017 11:48:09.6996 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB2061 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4201 Lines: 139 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 usually only do harm, it makes sense to disable kasan after the first one. If user wants to see all the reports, the boot-time parameter kasan_multi_shot must be used. Signed-off-by: Andrey Ryabinin --- Changes since v1: - provide kasan_multi_shot boot parameter. Documentation/admin-guide/kernel-parameters.txt | 6 ++++++ lib/test_kasan.c | 12 ++++++++++++ mm/kasan/kasan.h | 5 ----- mm/kasan/report.c | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 2906987..f88d60e 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -1726,6 +1726,12 @@ kernel and module base offset ASLR (Address Space Layout Randomization). + kasan_multi_shot + [KNL] Enforce KASAN (Kernel Address Sanitizer) to print + report on every invalid memory access. Without this + parameter KASAN will print report only for the first + invalid access. + keepinitrd [HW,ARM] kernelcore= [KNL,X86,IA-64,PPC] diff --git a/lib/test_kasan.c b/lib/test_kasan.c index 0b1d314..f3acece 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 #include #include #include @@ -21,6 +22,8 @@ #include #include +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_add(100, &kasan_report_count); + kmalloc_oob_right(); kmalloc_oob_left(); kmalloc_node_oob_right(); @@ -499,6 +505,12 @@ static int __init kmalloc_tests_init(void) ksize_unpoisons_memory(); copy_user_test(); use_after_scope_test(); + + /* + * kasan is unreliable now, disable reports if + * we are in single shot mode + */ + atomic_sub(100, &kasan_report_count); return -EAGAIN; } diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index 7572917..1229298 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -96,11 +96,6 @@ static inline const void *kasan_shadow_to_mem(const void *shadow_addr) << KASAN_SHADOW_SCALE_SHIFT); } -static inline bool kasan_report_enabled(void) -{ - return !current->kasan_depth; -} - void kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip); void kasan_report_double_free(struct kmem_cache *cache, void *object, diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 718a10a..5650534 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -13,7 +13,9 @@ * */ +#include #include +#include #include #include #include @@ -354,6 +356,22 @@ 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); + +static int __init kasan_set_multi_shot(char *str) +{ + atomic_set(&kasan_report_count, 1000000000); + return 1; +} +__setup("kasan_multi_shot", kasan_set_multi_shot); + +static inline bool kasan_report_enabled(void) +{ + return !current->kasan_depth && + (atomic_dec_if_positive(&kasan_report_count) >= 0); +} + void kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip) { -- 2.10.2