From patchwork Tue Mar 28 14:00:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 744294 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vssy56yZ4z9s7M for ; Wed, 29 Mar 2017 01:01:33 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="d+BClEhn"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753221AbdC1OBX (ORCPT ); Tue, 28 Mar 2017 10:01:23 -0400 Received: from mail-lf0-f50.google.com ([209.85.215.50]:34420 "EHLO mail-lf0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752719AbdC1OBV (ORCPT ); Tue, 28 Mar 2017 10:01:21 -0400 Received: by mail-lf0-f50.google.com with SMTP id z15so38921108lfd.1 for ; Tue, 28 Mar 2017 07:01:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=WTMiv5Nynq7yq1DSKD/PApGckswq0QIWLhtBXsmhQ04=; b=d+BClEhn5nToyX9heop8sHaFUFD0yyuy1/E/ltYFVv0N+GbHlObveU8YQqfqyaLCBh QvJY6hKwkiXapFlZTRTGi8mk/S7Le2ZviyKwW40ylWIcr3LvISqnjudXPtVGgU4OQWcE 8XhWswzGCQBa4LiQM+iviOjuceMNc5sIJoIboPiM2Eb854BQ6NKtBk6uw1bFHbH5pNvT Lgv4VTo66OkxdaIEdZXSCrfaCWrEiHjM5e7nt0/uXCdEDQlfvgEagU55WXleMus5Blpq ltclI+T7SQuo26KySyoE0pDhdMYQXxve16LvrHk5PBMCYrQLs2ka55nSbBPwWs2v9NVh 5C8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=WTMiv5Nynq7yq1DSKD/PApGckswq0QIWLhtBXsmhQ04=; b=a9gN5jU0uy+5rtSUXVvJy9+kgcA5aDkh5U7aU1e6OSJF6sIrZZkhQsF77jFM4AAFec nC+FAX6SBxE2HHfk910dWpXZv/y6G/hWVWBZxen6FNFQOcltg40dY/C4rvanGH+BNjLr QZaw2wb5i6Hn4JSuqFnnsjQjt9viqsEGxinGQI/zcUzqMFTZaxfsi0QZnDfDPhw00Z79 lWoRo1LP2oIWfc7UZWzGIY2bJSM4XX6b3hnAgff1ZYgs6t0lf3i9dTIyyFvVaXGnhYhV WFxciRMFFVRKE6qYpDO7x07XCazMXbktziU64HA6VS9APDTAagL0VGtn9gbIioJFAKKi iagw== X-Gm-Message-State: AFeK/H0B0Mz6mh3IwZFnaLBgOKdvT3VNbE6PvmXmTewA5yC7EVlXMg+nBNFDIEi4jHZKq//b X-Received: by 10.28.137.211 with SMTP id l202mr14740550wmd.118.1490709666826; Tue, 28 Mar 2017 07:01:06 -0700 (PDT) Received: from andreyknvl0.muc.corp.google.com ([100.105.12.17]) by smtp.gmail.com with ESMTPSA id k203sm3766621wmk.4.2017.03.28.07.01.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Mar 2017 07:01:04 -0700 (PDT) Received: by andreyknvl0.muc.corp.google.com (Postfix, from userid 206546) id 4CE08182DA7; Tue, 28 Mar 2017 16:00:56 +0200 (CEST) From: Andrey Konovalov To: "David S . Miller" , Eric Dumazet , Willem de Bruijn , Craig Gallek Cc: netdev@vger.kernel.org, Dmitry Vyukov , Kostya Serebryany , Andrey Konovalov Subject: [PATCH v4 4/9] kasan: simplify address description logic Date: Tue, 28 Mar 2017 16:00:47 +0200 Message-Id: <91b198a9825326a3f3e9037df60d49704f5479ad.1490383597.git.andreyknvl@google.com> X-Mailer: git-send-email 2.12.2.564.g063fe858b8-goog In-Reply-To: References: In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Simplify logic for describing a memory address. Add addr_to_page() helper function. Makes the code easier to follow. Signed-off-by: Andrey Konovalov --- mm/kasan/report.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 382d4d2b9052..f77341979dae 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -188,11 +188,17 @@ static void print_track(struct kasan_track *track, const char *prefix) } } -static void kasan_object_err(struct kmem_cache *cache, void *object) +static struct page *addr_to_page(const void *addr) +{ + if ((addr >= (void *)PAGE_OFFSET) && (addr < high_memory)) + return virt_to_head_page(addr); + return NULL; +} + +static void describe_object(struct kmem_cache *cache, void *object) { struct kasan_alloc_meta *alloc_info = get_alloc_info(cache, object); - dump_stack(); pr_err("Object at %p, in cache %s size: %d\n", object, cache->name, cache->object_size); @@ -211,34 +217,32 @@ void kasan_report_double_free(struct kmem_cache *cache, void *object, kasan_start_report(&flags); pr_err("BUG: Double free or freeing an invalid pointer\n"); pr_err("Unexpected shadow byte: 0x%hhX\n", shadow); - kasan_object_err(cache, object); + dump_stack(); + describe_object(cache, object); kasan_end_report(&flags); } static void print_address_description(struct kasan_access_info *info) { const void *addr = info->access_addr; + struct page *page = addr_to_page(addr); - if ((addr >= (void *)PAGE_OFFSET) && - (addr < high_memory)) { - struct page *page = virt_to_head_page(addr); - - if (PageSlab(page)) { - void *object; - struct kmem_cache *cache = page->slab_cache; - object = nearest_obj(cache, page, - (void *)info->access_addr); - kasan_object_err(cache, object); - return; - } + if (page) dump_page(page, "kasan: bad access detected"); + + dump_stack(); + + if (page && PageSlab(page)) { + struct kmem_cache *cache = page->slab_cache; + void *object = nearest_obj(cache, page, (void *)addr); + + describe_object(cache, object); } if (kernel_or_module_addr(addr)) { if (!init_task_stack_addr(addr)) pr_err("Address belongs to variable %pS\n", addr); } - dump_stack(); } static bool row_is_guilty(const void *row, const void *guilty)