From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932515AbcEFMpz (ORCPT ); Fri, 6 May 2016 08:45:55 -0400 Received: from mail-am1on0101.outbound.protection.outlook.com ([157.56.112.101]:37636 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758111AbcEFMpJ (ORCPT ); Fri, 6 May 2016 08:45:09 -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 Ryabinin , Alexander Potapenko , Dmitry Vyukov Subject: [PATCH 2/4] mm/kasan: print name of mem[set,cpy,move]() caller in report Date: Fri, 6 May 2016 15:45:20 +0300 Message-ID: <1462538722-1574-2-git-send-email-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.7.3 In-Reply-To: <1462538722-1574-1-git-send-email-aryabinin@virtuozzo.com> References: <1462538722-1574-1-git-send-email-aryabinin@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM3PR07CA0025.eurprd07.prod.outlook.com (10.141.45.153) To DB6PR0801MB1303.eurprd08.prod.outlook.com (10.168.11.21) X-MS-Office365-Filtering-Correlation-Id: b6c68510-b9ca-404b-f47d-08d375ac407d X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;2:Hmb0q1dycnp7TzGmQBst5WRVeh1z/FkdlEclJI83nsrKmV9iBIYP5CvZEAgItzFfwBMLP9nbDbcvS4NBsesPwefS8cIXca5U2M243P2srochFYmxndVrfjtcxKK0Hx5f1lCEJijMIsfVp9x/qVNUMDSYj9F/y8JWCGjlx4IPMmOXh1IlgF0D/JxgKkg41czw;3:z7lx+0mTWDo7l3zTfuiSKRxzoJxoe8t3FlNv7dVYgHT/4ndt8ZHfThThy/B5TfNrc7oPma5dCXARgcoTEvfMU4EjIrpmXGo09mNu/iPyFjVFG4Wr/7PPsl8eGbtWM+yT;25:BhsiVDN7hw+Ir1hVXUZeLfsKnfjDi3Bu5DVRPptU07zBsQMpDIVZQUecDHvsFLENtBEIbbQFtJU4ZaEqmc0yAFklI91n1YVs41tEdm6eN6iJkqV/F1E4TtY3LrIxoSwRqNhWiiK0KlnsUl91Z5HFouspCwjDDeeJYr7sL04mcF6jQ+71fQtnNaMM+euN/+ml1Ruo88kYUtDEjyvJIcb1Nw+cu0DMlx3CYh+daDOPcLSN5I25fCGOn4AsBGnSG9Sr1rkaSFFtubfFFIlEyIk8nQqOjqVMYzqE2vXPsss2sYLEZX11AL0sGRnUr6wEi5bDIk9qXjBVzHb+1a4FcT9f9Q957+mWXh7f6u7NDFx179rYU4e78ll8uP5ilAukapi7xjyDwK2IMo5EzjLbSYxPocKAOdG3wpEXjKgcpxS0z8O5g62HnZOyYKlX5I6XAF2T X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1303; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041072)(6043046);SRVR:DB6PR0801MB1303;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1303; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;4:AqcT/bQXUl93qXCuWnLKY/d6J2yn1+JutLJR6XNUPvBSr47umfJ//z0mOkY3Xkby4eTacPVJj4WhbyE/ycBTGE/Y7r9txdR8+y0TF1JtKArBnOMriSnU855uMj5usjUvGWvO4kHThl9qiqojfSB4eQ5F+RkfbMzIzteTMqx6U34goreuTLMOTun9rxjq5SqgGZ4T0pggGZJJlydkbEtlzo5ukmjxtsvBUjO8PYRu3M0I0N3Y4JbMLaAnJly0syL4RGZ4PL7+bxk8nqtshrFBq/C38hnBcHYYPhRKvC56SGqC5cHl4yWBzYBlbVnhufhLS5FRvLTTBMmkLZX3D27D27uHqqOLrWnykFqMaBJAdXCCefyBe0vMyWEGHC6/g0C5YHrD2Dt+kGYmW2oH/VrytF/TrWLu7J03DoDuJvJJLQ8= X-Forefront-PRVS: 09347618C4 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6069001)(6009001)(33646002)(5008740100001)(2950100001)(47776003)(66066001)(2906002)(4326007)(92566002)(50226002)(77096005)(5004730100002)(110136002)(48376002)(76176999)(50986999)(19580405001)(586003)(50466002)(6116002)(42186005)(36756003)(189998001)(19580395003)(5003940100001)(86362001)(229853001)(81166005)(3846002)(53416004)(76506005)(142933001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1303;H:localhost.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;23:6SinBGpmmfop3Ro05gdmdifAhMJ815ky+ROfRmcEfaAhFUAxzYYz3rbbJvxuSxGTKxHde2eWxQSs8N3pRzGWvJpTzgTZATq8S8fNaFwmJxsfHnNhjOm/XJ6/2c4/FxsbipdSDYxRx2jUeeZh+Y2Hh2TFmDcTvLOcbRHcigSPEbmg1/XgWqjU3GXm7wsOWwbHMlSxva6n6EvH+vwbugTO3C0653DDDkKrItUv8FwdfVgJ+4bpurXs5IS22N1npTjXWXBwX3CzbOaDxAby5NJY35W2wZrig9yPlT/7BJNXvmHSUy4hdBdN1xr9IlDol0mP3zEq4JjKTeJnTWOG1JttyDPdUyAYFxGWwjGrGyU1nrsp9GONj1pu6c47puKgstPfv0PU/OH4CZ1luvwTeHQhQu48FTaMwtRx+NaLOwfWRDShDszG+BEOc54KiPyveIpGH1e+UQUFr4D/+KIoVOuywSI0xtmGUy1Yzsoumsmr5Yue0HkyQK/pWUzbS7lHuCMICDv8IjXbVcITOCXfuy9S5XnZvP479WUTp2+8RooiYerlhfGHXnjZmH3VYvlHgsYkYExA3MPVYh4Mzoyn4fGdOnZaSLH3wkdvCsaWaQvC/ekFQ0Z3alG5lg9+Fi/59T+FhSPL/BZrkl/nxQggoAfhBHK6aHs22L5MmEI1l2OCL88ckhsVuepRbJw+1mp9Z8Q034ue61wxxPRTXT78jMvYTH/4n4RTLQ9l70xWWRTObL4eDKQHEOfSP08OS5abA5h/LhUzhsKXGZ0CiB+J5noUgd2CRdXo6iJ6XCtAj88n+/E+eCbKCO4395DwPEUyjNYfGNu+QNZnFK5AA4zSPuHkqtrtw2oK2IKVX28Rveb/8uZm1gSa5TyEWPFwD+XgdRgmgyEQUS6WXl7C5se0Y4tg4wPnWkdDnHhjSnP1KYcgKGc= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;5:s13JDbHcJz7VQaMowwWACxJ8NIkNhwZ75PUXMXI/vqRlQlRzMyp1EKLXsooC4juDeobUJmnm+JAIs677Us9U96O8P+tY8XZ0PaHVH78ctv2Ijp42JD45VOigHjbyHsmBvtWfEjNN7kBY2ZERZn8SFw==;24:8k93bltA5fsz+ke8gsu1EvM16MrNyxURNjDf0KYi/uBsNoS3FiFVqxrytmhPwPoEEXM7TuCUyIuImkXnoflcwkRB4/X3EoW5a80aM/utpps=;7:tbbx8UciaVO9hENN0Qr6NJ4ipQFFJ7SZsM46uKzCLx/omu/ux9GFBhv/XHiS+GDnzo01kg2IcMcHL78FwzDipscuNmkK3NZcDgikWUAoivoiRZGq89sLUhzU15mJdvPp83gfumTLwBfwuXao7zcbmI3O+Fy0FRvZBFV7mPPdcf6H/D9/0y8/cMNyo+75BTGf;20:YfmFXxtxBLHSuBEZaC2P2kBrzAZnWtbGGzU0CT3s+Iys/Rsw4cL/Pt/INrUVsk8XH2TroWVJkQNi2E5u8aYKhmQIo4aZkD0zhjtcAUUzKOZN0/ETt9SToHdepJBfcmtOIcm4ZotoxpZZtWpXxpVxfnQswiDhxwqOgT1HRWIi5Is= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2016 12:45:05.8380 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1303 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When bogus memory access happens in mem[set,cpy,move]() it's usually caller's fault. So don't blame mem[set,cpy,move]() in bug report, blame the caller instead. Before: BUG: KASAN: out-of-bounds access in memset+0x23/0x40 at
After: BUG: KASAN: out-of-bounds access in at
Signed-off-by: Andrey Ryabinin Cc: Alexander Potapenko Cc: Dmitry Vyukov --- mm/kasan/kasan.c | 64 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index ef2e87b..6e4072c 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c @@ -273,32 +273,36 @@ static __always_inline bool memory_is_poisoned(unsigned long addr, size_t size) return memory_is_poisoned_n(addr, size); } - -static __always_inline void check_memory_region(unsigned long addr, - size_t size, bool write) +static __always_inline void check_memory_region_inline(unsigned long addr, + size_t size, bool write, + unsigned long ret_ip) { if (unlikely(size == 0)) return; if (unlikely((void *)addr < kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) { - kasan_report(addr, size, write, _RET_IP_); + kasan_report(addr, size, write, ret_ip); return; } if (likely(!memory_is_poisoned(addr, size))) return; - kasan_report(addr, size, write, _RET_IP_); + kasan_report(addr, size, write, ret_ip); } -void __asan_loadN(unsigned long addr, size_t size); -void __asan_storeN(unsigned long addr, size_t size); +static void check_memory_region(unsigned long addr, + size_t size, bool write, + unsigned long ret_ip) +{ + check_memory_region_inline(addr, size, write, ret_ip); +} #undef memset void *memset(void *addr, int c, size_t len) { - __asan_storeN((unsigned long)addr, len); + check_memory_region((unsigned long)addr, len, true, _RET_IP_); return __memset(addr, c, len); } @@ -306,8 +310,8 @@ void *memset(void *addr, int c, size_t len) #undef memmove void *memmove(void *dest, const void *src, size_t len) { - __asan_loadN((unsigned long)src, len); - __asan_storeN((unsigned long)dest, len); + check_memory_region((unsigned long)src, len, false, _RET_IP_); + check_memory_region((unsigned long)dest, len, true, _RET_IP_); return __memmove(dest, src, len); } @@ -315,8 +319,8 @@ void *memmove(void *dest, const void *src, size_t len) #undef memcpy void *memcpy(void *dest, const void *src, size_t len) { - __asan_loadN((unsigned long)src, len); - __asan_storeN((unsigned long)dest, len); + check_memory_region((unsigned long)src, len, false, _RET_IP_); + check_memory_region((unsigned long)dest, len, true, _RET_IP_); return __memcpy(dest, src, len); } @@ -698,22 +702,22 @@ void __asan_unregister_globals(struct kasan_global *globals, size_t size) } EXPORT_SYMBOL(__asan_unregister_globals); -#define DEFINE_ASAN_LOAD_STORE(size) \ - void __asan_load##size(unsigned long addr) \ - { \ - check_memory_region(addr, size, false); \ - } \ - EXPORT_SYMBOL(__asan_load##size); \ - __alias(__asan_load##size) \ - void __asan_load##size##_noabort(unsigned long); \ - EXPORT_SYMBOL(__asan_load##size##_noabort); \ - void __asan_store##size(unsigned long addr) \ - { \ - check_memory_region(addr, size, true); \ - } \ - EXPORT_SYMBOL(__asan_store##size); \ - __alias(__asan_store##size) \ - void __asan_store##size##_noabort(unsigned long); \ +#define DEFINE_ASAN_LOAD_STORE(size) \ + void __asan_load##size(unsigned long addr) \ + { \ + check_memory_region_inline(addr, size, false, _RET_IP_);\ + } \ + EXPORT_SYMBOL(__asan_load##size); \ + __alias(__asan_load##size) \ + void __asan_load##size##_noabort(unsigned long); \ + EXPORT_SYMBOL(__asan_load##size##_noabort); \ + void __asan_store##size(unsigned long addr) \ + { \ + check_memory_region_inline(addr, size, true, _RET_IP_); \ + } \ + EXPORT_SYMBOL(__asan_store##size); \ + __alias(__asan_store##size) \ + void __asan_store##size##_noabort(unsigned long); \ EXPORT_SYMBOL(__asan_store##size##_noabort) DEFINE_ASAN_LOAD_STORE(1); @@ -724,7 +728,7 @@ DEFINE_ASAN_LOAD_STORE(16); void __asan_loadN(unsigned long addr, size_t size) { - check_memory_region(addr, size, false); + check_memory_region(addr, size, false, _RET_IP_); } EXPORT_SYMBOL(__asan_loadN); @@ -734,7 +738,7 @@ EXPORT_SYMBOL(__asan_loadN_noabort); void __asan_storeN(unsigned long addr, size_t size) { - check_memory_region(addr, size, true); + check_memory_region(addr, size, true, _RET_IP_); } EXPORT_SYMBOL(__asan_storeN); -- 2.7.3