Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp559840pxa; Fri, 14 Aug 2020 11:17:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz6p3b4DtbkzWxazG8ZULbzLw/oToWAX2NXWhQxNP409jQRU8HUvY4elWEoQjIJ9eI278ib X-Received: by 2002:a05:6402:206d:: with SMTP id bd13mr3533032edb.57.1597429051255; Fri, 14 Aug 2020 11:17:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597429051; cv=none; d=google.com; s=arc-20160816; b=OSGcHo/JD5jGgQKHPyYxHuq0V00BpybfcUorrcKtjMD2qgLxL9qc3KtinNXCHjFKVv HrdlDXIUi0eSWQ/Ko2N5nBsi55wmBWdxJq4hBPzgLs1dl90x3DHW/cfE8riMvjBGfTW9 OTC2ySE5ajzAjrJFEc9tLsgOLICgY/qzhXbnsupEhYRSQNTGwazbczPdEt5JlRQ1g1xD 9Zu9G+Kp1pff7cQPSfcZ8IMeuMqYzeKz4h/rYeTipjg9908zI5zL+bX/F74istoUK7vg e25Mt/CNV2E8wbEDt00yILMO+E+AdndMBRhWA6VrrPR3WADsIlov522kaNYYvJ/dPG9k YqQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=1rxlsTFeHZWa6ONOeuQ+mv6OBF5H+hBIiaZ8LmsUVlw=; b=iarXB/oxg7LxIa3ZzLAulGlhe3Ax+6voCQ5nZtCJhCUbTUXuf/QTwacJ9NygTrZq8i 4lAmHOR564ykKJylZLBI4TqbYSNNm6GvcdVa7/AKNPiqd5t6NDnfyXTJD+3wfHVIq+9b JySMv/ss+Uqa5PZz/uJCpqtxH8Fi5DbqO9ayujY/G2fg67HczesCCDTT7WU/Ofhx3kPZ 9q/AQFkISqg7d1RBjdV5tEK06mqjafq42ksIShBEOjMTv+aNO2BgKhqlAs0cb5fY+YF3 OOqRAu752fHbjm+6MM3xCG5/8rW3uJrqDAPuOQwn71PjQ4s//xD/b0ybfYpV8nEvLab4 myiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=aNwZunoi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qk16si6105986ejb.532.2020.08.14.11.17.07; Fri, 14 Aug 2020 11:17:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=aNwZunoi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728613AbgHNR1z (ORCPT + 99 others); Fri, 14 Aug 2020 13:27:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37466 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728588AbgHNR1u (ORCPT ); Fri, 14 Aug 2020 13:27:50 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2941EC061385 for ; Fri, 14 Aug 2020 10:27:50 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id j8so6517978qvu.3 for ; Fri, 14 Aug 2020 10:27:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=1rxlsTFeHZWa6ONOeuQ+mv6OBF5H+hBIiaZ8LmsUVlw=; b=aNwZunoi3mHHGlkooltBIe1Qkubi/Wo4oN/aIQ8lJRAMl5UdW3bTgJ7rzr67Ve3nb9 NmIv70kXBmf9zj7wn/wHi1N+LQlkhMMIAhFqieQWyYW0N8bY+pORzmxtURdzki0k4eXa 7jMkkdZvld9iNJ6dSN1lwxzvAL+ufKxNXVbH6ohxLnW5O6OdvxyRZ/5SQvizoh0g0U6b PWK5aOsiCFlMDuHtC5AhpdDaMonU4i2ODCGn6wtzxS0yoh4RG/AmFrygZ2yS/xZRPhth RpX6GO6SuWsFFoAVqp3S1UBnm51SNGIhYykTHVzhrTqcmklo+ppF2q0ZpFwCl2fGiFR6 puPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=1rxlsTFeHZWa6ONOeuQ+mv6OBF5H+hBIiaZ8LmsUVlw=; b=Q+xsYHpBPIge5PrJG8bpxoUyrIUldl+dWVgWSc80onhuNNArkOLktuVAir+X+7TeC5 VZV7XCsescpxlkkmpAEoa2B6Ldv4bB6PBqq1wSiT5gbdmjO/r6e1nOvyiUQFROhNg9Lh 1Nvpl9Xs1PIwsAXDKoViTtWDZwR2692s4qdCGb3/uHR3fd1PG0ilBJlrupUyFSw09qAV ASIga0Jyn1A+65FpMdi9tKEwJl29jw5KUZT/0EjJwFR62j92mfQnAKXdnPn4Z5XdkLkV NyEkNwNboQcmHmXK0exZyHvlNP+D9gpMqcEgex5W8j4NGUXz58s7Uh72TTv678S0dIVV 5lnQ== X-Gm-Message-State: AOAM533F4jx6hIpqBaXtmZOvGaYooKD37zw2VI+zZIUuhbdn3RG3VTiX kdaCMdUK+uytJI6+OsYELKstXUiyIm4WLu7A X-Received: by 2002:ad4:40cb:: with SMTP id x11mr3720078qvp.176.1597426068373; Fri, 14 Aug 2020 10:27:48 -0700 (PDT) Date: Fri, 14 Aug 2020 19:26:52 +0200 In-Reply-To: Message-Id: <5a3f6b39567f2b7270e8d45bf1b909796259d3d1.1597425745.git.andreyknvl@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.28.0.220.ged08abb693-goog Subject: [PATCH 10/35] kasan: hide invalid free check implementation From: Andrey Konovalov To: Dmitry Vyukov , Vincenzo Frascino , Catalin Marinas , kasan-dev@googlegroups.com Cc: Andrey Ryabinin , Alexander Potapenko , Marco Elver , Evgenii Stepanov , Elena Petrova , Branislav Rankov , Kevin Brodsky , Will Deacon , Andrew Morton , linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Konovalov Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a preparatory commit for the upcoming addition of a new hardware tag-based (MTE-based) KASAN mode. For software KASAN modes the check is based on the value in the shadow memory. Hardware tag-based KASAN won't be using shadow, so hide the implementation of the check in check_invalid_free(). No functional changes for software modes. Signed-off-by: Andrey Konovalov --- mm/kasan/common.c | 19 +------------------ mm/kasan/generic.c | 7 +++++++ mm/kasan/kasan.h | 2 ++ mm/kasan/tags.c | 12 ++++++++++++ 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/mm/kasan/common.c b/mm/kasan/common.c index 43a927e70067..a2321d35390e 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -277,25 +277,9 @@ void * __must_check kasan_init_slab_obj(struct kmem_cache *cache, return (void *)object; } -static inline bool shadow_invalid(u8 tag, s8 shadow_byte) -{ - if (IS_ENABLED(CONFIG_KASAN_GENERIC)) - return shadow_byte < 0 || - shadow_byte >= KASAN_GRANULE_SIZE; - - /* else CONFIG_KASAN_SW_TAGS: */ - if ((u8)shadow_byte == KASAN_TAG_INVALID) - return true; - if ((tag != KASAN_TAG_KERNEL) && (tag != (u8)shadow_byte)) - return true; - - return false; -} - static bool __kasan_slab_free(struct kmem_cache *cache, void *object, unsigned long ip, bool quarantine) { - s8 shadow_byte; u8 tag; void *tagged_object; unsigned long rounded_up_size; @@ -314,8 +298,7 @@ static bool __kasan_slab_free(struct kmem_cache *cache, void *object, if (unlikely(cache->flags & SLAB_TYPESAFE_BY_RCU)) return false; - shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object)); - if (shadow_invalid(tag, shadow_byte)) { + if (check_invalid_free(tagged_object)) { kasan_report_invalid_free(tagged_object, ip); return true; } diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c index f6d68aa9872f..73f4d786ad5d 100644 --- a/mm/kasan/generic.c +++ b/mm/kasan/generic.c @@ -192,6 +192,13 @@ bool check_memory_region(unsigned long addr, size_t size, bool write, return check_memory_region_inline(addr, size, write, ret_ip); } +bool check_invalid_free(void *addr) +{ + s8 shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(addr)); + + return shadow_byte < 0 || shadow_byte >= KASAN_GRANULE_SIZE; +} + void kasan_cache_shrink(struct kmem_cache *cache) { quarantine_remove_cache(cache); diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index c31e2c739301..cf6a135860f2 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -163,6 +163,8 @@ void kasan_poison_memory(const void *address, size_t size, u8 value); bool check_memory_region(unsigned long addr, size_t size, bool write, unsigned long ret_ip); +bool check_invalid_free(void *addr); + void *find_first_bad_addr(void *addr, size_t size); const char *get_bug_type(struct kasan_access_info *info); diff --git a/mm/kasan/tags.c b/mm/kasan/tags.c index 4d5a1fe8251f..feb42c1763b8 100644 --- a/mm/kasan/tags.c +++ b/mm/kasan/tags.c @@ -126,6 +126,18 @@ bool check_memory_region(unsigned long addr, size_t size, bool write, return true; } +bool check_invalid_free(void *addr) +{ + u8 tag = get_tag(addr); + u8 shadow_byte = READ_ONCE(*(u8 *)kasan_mem_to_shadow(reset_tag(addr))); + + if (shadow_byte == KASAN_TAG_INVALID) + return true; + if (tag != KASAN_TAG_KERNEL && tag != shadow_byte) + return true; + return false; +} + #define DEFINE_HWASAN_LOAD_STORE(size) \ void __hwasan_load##size##_noabort(unsigned long addr) \ { \ -- 2.28.0.220.ged08abb693-goog