From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D52BFC433EF for ; Sun, 3 Jul 2022 23:15:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 63FE66B0072; Sun, 3 Jul 2022 19:15:55 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5C8AC6B0073; Sun, 3 Jul 2022 19:15:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 469776B0074; Sun, 3 Jul 2022 19:15:55 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 33EE46B0072 for ; Sun, 3 Jul 2022 19:15:55 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 0D96B21867 for ; Sun, 3 Jul 2022 23:15:55 +0000 (UTC) X-FDA: 79647348270.26.3DE3BE8 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf27.hostedemail.com (Postfix) with ESMTP id 9B32940014 for ; Sun, 3 Jul 2022 23:15:54 +0000 (UTC) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D66A16122A; Sun, 3 Jul 2022 23:15:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8E80C341C6; Sun, 3 Jul 2022 23:15:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1656890153; bh=6ZlA7AQwed1b+Qbqhl49hZpBrdZGq0u3Y8Xc/8IfGvM=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=I9H7MVvwCGyF5EotDM1U20idIoHdP25AYE3YpwidP8cFIoPSvTlU1Z79MBXQDiAN+ U2ENsuk5lCHzaIsstSbPuR2Mm7MYzwGy+4XA3COkrhr3Iyyk8mJ1xrVBGeqJSEYxHZ c7Q8J/EwSTU2lHZPw6EGto+1c+WFT4P0LOJXoH9Y= Date: Sun, 3 Jul 2022 16:15:52 -0700 From: Andrew Morton To: Kuan-Ying Lee Cc: Andrey Ryabinin , Alexander Potapenko , Andrey Konovalov , Dmitry Vyukov , Vincenzo Frascino , Matthias Brugger , , , , , , , , , Subject: Re: [PATCH] kasan: separate double free case from invalid free Message-Id: <20220703161552.6a3304c8d316e4fdcce42caa@linux-foundation.org> In-Reply-To: <20220615062219.22618-1-Kuan-Ying.Lee@mediatek.com> References: <20220615062219.22618-1-Kuan-Ying.Lee@mediatek.com> X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.33; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=I9H7MVvw; dmarc=none; spf=pass (imf27.hostedemail.com: domain of akpm@linux-foundation.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1656890154; a=rsa-sha256; cv=none; b=KRptxc6/w/HLvGzR8Ak7uASiXjz1qAk0wknYGUQ4nj69t483XEWM34bFjWTq9hPklCy7Jl Vi0PCsMO57PeuDQ0zeaJt9CUjjw/9YqJi/tbzriy4CQgwp7SmmCJMKsPdiIsSW6WljJY/I vxsnzmiFD6VUQsNEJZESI+SQqpKXmHs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1656890154; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=4eyxsET1uUtYDmBiIGGjIUzqUUGx8+bu39Q63tWlZoY=; b=o76FrN3d3qsWcPPP0RuCa0s0TMloZU1nw5gDB1QwURGKfm9av0U1NkIKrpInGGBnKgiBTk cNqJruAqWOggXyyzSY/Aqc+DbcZWi4oVGlfZ20Mc/0vmmXk9RtDqbWIe4JUH/gFN9c7ogK Dw8cwSULhSTRxcybLVikGWtj98VD5GQ= X-Rspam-User: Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=I9H7MVvw; dmarc=none; spf=pass (imf27.hostedemail.com: domain of akpm@linux-foundation.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 9B32940014 X-Stat-Signature: itojfn38z6ducikmr4u31ndf36k9qw1c X-HE-Tag: 1656890154-403454 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Wed, 15 Jun 2022 14:22:18 +0800 Kuan-Ying Lee wrote: > Currently, KASAN describes all invalid-free/double-free bugs as > "double-free or invalid-free". This is ambiguous. > > KASAN should report "double-free" when a double-free is a more > likely cause (the address points to the start of an object) and > report "invalid-free" otherwise [1]. > > [1] https://bugzilla.kernel.org/show_bug.cgi?id=212193 > > ... Could we please have some review of this? Thanks. > > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > index c40c0e7b3b5f..707c3a527fcb 100644 > --- a/mm/kasan/common.c > +++ b/mm/kasan/common.c > @@ -343,7 +343,7 @@ static inline bool ____kasan_slab_free(struct kmem_cache *cache, void *object, > > if (unlikely(nearest_obj(cache, virt_to_slab(object), object) != > object)) { > - kasan_report_invalid_free(tagged_object, ip); > + kasan_report_invalid_free(tagged_object, ip, KASAN_REPORT_INVALID_FREE); > return true; > } > > @@ -352,7 +352,7 @@ static inline bool ____kasan_slab_free(struct kmem_cache *cache, void *object, > return false; > > if (!kasan_byte_accessible(tagged_object)) { > - kasan_report_invalid_free(tagged_object, ip); > + kasan_report_invalid_free(tagged_object, ip, KASAN_REPORT_DOUBLE_FREE); > return true; > } > > @@ -377,12 +377,12 @@ bool __kasan_slab_free(struct kmem_cache *cache, void *object, > static inline bool ____kasan_kfree_large(void *ptr, unsigned long ip) > { > if (ptr != page_address(virt_to_head_page(ptr))) { > - kasan_report_invalid_free(ptr, ip); > + kasan_report_invalid_free(ptr, ip, KASAN_REPORT_INVALID_FREE); > return true; > } > > if (!kasan_byte_accessible(ptr)) { > - kasan_report_invalid_free(ptr, ip); > + kasan_report_invalid_free(ptr, ip, KASAN_REPORT_DOUBLE_FREE); > return true; > } > > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > index 610d60d6e5b8..01c03e45acd4 100644 > --- a/mm/kasan/kasan.h > +++ b/mm/kasan/kasan.h > @@ -125,6 +125,7 @@ static inline bool kasan_sync_fault_possible(void) > enum kasan_report_type { > KASAN_REPORT_ACCESS, > KASAN_REPORT_INVALID_FREE, > + KASAN_REPORT_DOUBLE_FREE, > }; > > struct kasan_report_info { > @@ -277,7 +278,7 @@ static inline void kasan_print_address_stack_frame(const void *addr) { } > > bool kasan_report(unsigned long addr, size_t size, > bool is_write, unsigned long ip); > -void kasan_report_invalid_free(void *object, unsigned long ip); > +void kasan_report_invalid_free(void *object, unsigned long ip, enum kasan_report_type type); > > struct page *kasan_addr_to_page(const void *addr); > struct slab *kasan_addr_to_slab(const void *addr); > diff --git a/mm/kasan/report.c b/mm/kasan/report.c > index b341a191651d..fe3f606b3a98 100644 > --- a/mm/kasan/report.c > +++ b/mm/kasan/report.c > @@ -176,8 +176,12 @@ static void end_report(unsigned long *flags, void *addr) > static void print_error_description(struct kasan_report_info *info) > { > if (info->type == KASAN_REPORT_INVALID_FREE) { > - pr_err("BUG: KASAN: double-free or invalid-free in %pS\n", > - (void *)info->ip); > + pr_err("BUG: KASAN: invalid-free in %pS\n", (void *)info->ip); > + return; > + } > + > + if (info->type == KASAN_REPORT_DOUBLE_FREE) { > + pr_err("BUG: KASAN: double-free in %pS\n", (void *)info->ip); > return; > } > > @@ -433,7 +437,7 @@ static void print_report(struct kasan_report_info *info) > } > } > > -void kasan_report_invalid_free(void *ptr, unsigned long ip) > +void kasan_report_invalid_free(void *ptr, unsigned long ip, enum kasan_report_type type) > { > unsigned long flags; > struct kasan_report_info info; > @@ -448,7 +452,7 @@ void kasan_report_invalid_free(void *ptr, unsigned long ip) > > start_report(&flags, true); > > - info.type = KASAN_REPORT_INVALID_FREE; > + info.type = type; > info.access_addr = ptr; > info.first_bad_addr = kasan_reset_tag(ptr); > info.access_size = 0; > -- > 2.18.0 >