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 X-Spam-Level: X-Spam-Status: No, score=-22.4 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DD240C43603 for ; Fri, 20 Dec 2019 18:51:39 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 98CEC206D8 for ; Fri, 20 Dec 2019 18:51:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="hHNUDvtY" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 98CEC206D8 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 451FC8E01C1; Fri, 20 Dec 2019 13:51:39 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 401CC8E019D; Fri, 20 Dec 2019 13:51:39 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2F1678E01C1; Fri, 20 Dec 2019 13:51:39 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0222.hostedemail.com [216.40.44.222]) by kanga.kvack.org (Postfix) with ESMTP id 19A8A8E019D for ; Fri, 20 Dec 2019 13:51:39 -0500 (EST) Received: from smtpin15.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with SMTP id D0583180AD81A for ; Fri, 20 Dec 2019 18:51:38 +0000 (UTC) X-FDA: 76286413476.15.tray53_82b07d6ea5023 X-HE-Tag: tray53_82b07d6ea5023 X-Filterd-Recvd-Size: 10193 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) by imf06.hostedemail.com (Postfix) with ESMTP for ; Fri, 20 Dec 2019 18:51:37 +0000 (UTC) Received: by mail-wr1-f73.google.com with SMTP id z15so1498048wrw.0 for ; Fri, 20 Dec 2019 10:51:37 -0800 (PST) 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=6mM5okZNT0m7CKfXZSL14eUmnvIc4wYA6Oe5Zu8oM84=; b=hHNUDvtYtY5CXiohRdcJpIpFgRoZZzeeKOUOkHQYgtw+FL+swtvLWP9a27vAXl9uRw jyI6TNtFQM3it5o35PDdvRlPdalx/jgWMvwBkxvCedYSjiyUgZ9sNxYUfDexytM5/nrT nx3Yxp4CxiW55YP18GCdK6WSGMQ3YhqqOybwavH6p2DQJTlFNuSVN5bMXCgdpBaNdROB UZDZGBBMxNzCZVD5NQpmTAG3qTUATk6bvV8gfrKwoiCdxTcIDqRsau8Py1e3MOu8pBP8 Ma3VT3Xkw2/Tvumg1pHCP45W79uVXGoDqQ/LAvE80tTzJWSOfYn2kehrE4rRJ+FITWaz ie5w== 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=6mM5okZNT0m7CKfXZSL14eUmnvIc4wYA6Oe5Zu8oM84=; b=aThtoD//BhkcUf/fMNpmwo13C7d6dBfhPzQ1nVZzLTVKY7QaNZDLsE+UShvm/j4NU/ t7qkUwD2KmlEwEcpNBheOi24KFfXdEhj6AO8q3uH1ZloIVfsBWGiQDv0S7Psl1hb+O4c Fd9tSDblxz4FJ38Vd/ntWMyhJlRQNFU1HVvgURvLkb879qHT0v3OB86c8TMmWXfdrJyk 3s2GwrcKsk9Qfb36IcB9NHqZIFRFlFwlqPEr19wWTO7wFx/qfzGZ+S6uCArQrtCvnCud 7GnBPlhJLOSLzfbNxg2z8wSvUItmIsJcl5Zp71aVEuYi1dsxgmp5nXxBsNr7m+nDM93R 4v/Q== X-Gm-Message-State: APjAAAVLmIiJjMAKGtXDkylF8R8SyITYKbslLu5xGJc0uQS1rIMmcSnL bA7S4GiFvmtFxVIVbKdEbv/RkiHX/GE= X-Google-Smtp-Source: APXvYqxkhc0H4EBkQQJ3wTmRgGf7YZtPj4cFSpHxzkmcTnL/JtgjlePgxQh17rAIOYhvy7Zzyxo9S/0WXQ4= X-Received: by 2002:adf:fe43:: with SMTP id m3mr17307542wrs.213.1576867896471; Fri, 20 Dec 2019 10:51:36 -0800 (PST) Date: Fri, 20 Dec 2019 19:49:43 +0100 In-Reply-To: <20191220184955.223741-1-glider@google.com> Message-Id: <20191220184955.223741-31-glider@google.com> Mime-Version: 1.0 References: <20191220184955.223741-1-glider@google.com> X-Mailer: git-send-email 2.24.1.735.g03f4e72817-goog Subject: [PATCH RFC v4 30/42] kmsan: use __msan_ string functions where possible. From: glider@google.com To: Vegard Nossum , Dmitry Vyukov , Marco Elver , Andrey Konovalov , linux-mm@kvack.org Cc: glider@google.com, viro@zeniv.linux.org.uk, adilger.kernel@dilger.ca, akpm@linux-foundation.org, aryabinin@virtuozzo.com, luto@kernel.org, ard.biesheuvel@linaro.org, arnd@arndb.de, hch@infradead.org, hch@lst.de, darrick.wong@oracle.com, davem@davemloft.net, dmitry.torokhov@gmail.com, ebiggers@google.com, edumazet@google.com, ericvh@gmail.com, gregkh@linuxfoundation.org, harry.wentland@amd.com, herbert@gondor.apana.org.au, iii@linux.ibm.com, mingo@elte.hu, jasowang@redhat.com, axboe@kernel.dk, m.szyprowski@samsung.com, mark.rutland@arm.com, martin.petersen@oracle.com, schwidefsky@de.ibm.com, willy@infradead.org, mst@redhat.com, mhocko@suse.com, monstr@monstr.eu, pmladek@suse.com, cai@lca.pw, rdunlap@infradead.org, robin.murphy@arm.com, sergey.senozhatsky@gmail.com, rostedt@goodmis.org, tiwai@suse.com, tytso@mit.edu, tglx@linutronix.de, gor@linux.ibm.com, wsa@the-dreams.de Content-Type: text/plain; charset="UTF-8" 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: Unless stated otherwise (by explicitly calling __memcpy(), __memset() or __memmove()) we want all string functions to call their __msan_ versions (e.g. __msan_memcpy() instead of memcpy()), so that shadow and origin values are updated accordingly. Bootloader must still use the default string functions to avoid crashes. Signed-off-by: Alexander Potapenko To: Alexander Potapenko Cc: Vegard Nossum Cc: Dmitry Vyukov Cc: Marco Elver Cc: Andrey Konovalov Cc: linux-mm@kvack.org --- v3: - use default string functions in the bootloader v4: - include kmsan-checks.h into compiler.h - also handle memset() and memmove() - fix https://github.com/google/kmsan/issues/64 Change-Id: Ib2512ce5aa8d457453dd38caa12f58f002166813 --- arch/x86/boot/compressed/misc.h | 1 + arch/x86/include/asm/string_64.h | 23 ++++++++++++++++++- .../firmware/efi/libstub/efi-stub-helper.c | 5 ++++ drivers/firmware/efi/libstub/tpm.c | 5 ++++ include/linux/compiler.h | 9 +++++++- include/linux/string.h | 2 ++ 6 files changed, 43 insertions(+), 2 deletions(-) diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h index c8181392f70d..dd4bd8c5d97a 100644 --- a/arch/x86/boot/compressed/misc.h +++ b/arch/x86/boot/compressed/misc.h @@ -12,6 +12,7 @@ #undef CONFIG_PARAVIRT_XXL #undef CONFIG_PARAVIRT_SPINLOCKS #undef CONFIG_KASAN +#undef CONFIG_KMSAN /* cpu_feature_enabled() cannot be used this early */ #define USE_EARLY_PGTABLE_L5 diff --git a/arch/x86/include/asm/string_64.h b/arch/x86/include/asm/string_64.h index 75314c3dbe47..0442e679b307 100644 --- a/arch/x86/include/asm/string_64.h +++ b/arch/x86/include/asm/string_64.h @@ -11,11 +11,23 @@ function. */ #define __HAVE_ARCH_MEMCPY 1 +#if defined(CONFIG_KMSAN) +#undef memcpy +/* __msan_memcpy() is defined in compiler.h */ +#define memcpy(dst, src, len) __msan_memcpy(dst, src, len) +#else extern void *memcpy(void *to, const void *from, size_t len); +#endif extern void *__memcpy(void *to, const void *from, size_t len); #define __HAVE_ARCH_MEMSET +#if defined(CONFIG_KMSAN) +extern void *__msan_memset(void *s, int c, size_t n); +#undef memset +#define memset(dst, c, len) __msan_memset(dst, c, len) +#else void *memset(void *s, int c, size_t n); +#endif void *__memset(void *s, int c, size_t n); #define __HAVE_ARCH_MEMSET16 @@ -55,7 +67,13 @@ static inline void *memset64(uint64_t *s, uint64_t v, size_t n) } #define __HAVE_ARCH_MEMMOVE +#if defined(CONFIG_KMSAN) +#undef memmove +void *__msan_memmove(void *dest, const void *src, size_t len); +#define memmove(dst, src, len) __msan_memmove(dst, src, len) +#else void *memmove(void *dest, const void *src, size_t count); +#endif void *__memmove(void *dest, const void *src, size_t count); int memcmp(const void *cs, const void *ct, size_t count); @@ -64,7 +82,8 @@ char *strcpy(char *dest, const char *src); char *strcat(char *dest, const char *src); int strcmp(const char *cs, const char *ct); -#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) +#if (defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)) || \ + (defined(CONFIG_KMSAN) && !defined(__SANITIZE_MEMORY__)) /* * For files that not instrumented (e.g. mm/slub.c) we @@ -73,7 +92,9 @@ int strcmp(const char *cs, const char *ct); #undef memcpy #define memcpy(dst, src, len) __memcpy(dst, src, len) +#undef memmove #define memmove(dst, src, len) __memmove(dst, src, len) +#undef memset #define memset(s, c, n) __memset(s, c, n) #ifndef __NO_FORTIFY diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index e02579907f2e..79393691533a 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -5,7 +5,12 @@ * implementation files. * * Copyright 2011 Intel Corporation; author Matt Fleming + * + * + * This file is not linked with KMSAN runtime. + * Do not replace memcpy with __memcpy. */ +#undef CONFIG_KMSAN #include #include diff --git a/drivers/firmware/efi/libstub/tpm.c b/drivers/firmware/efi/libstub/tpm.c index eb9af83e4d59..1b5ff4f7eb3c 100644 --- a/drivers/firmware/efi/libstub/tpm.c +++ b/drivers/firmware/efi/libstub/tpm.c @@ -6,7 +6,12 @@ * Copyright (C) 2017 Google, Inc. * Matthew Garrett * Thiebaud Weksteen + * + * + * This file is not linked with KMSAN runtime. + * Do not replace memcpy with __memcpy. */ +#undef CONFIG_KMSAN #include #include #include diff --git a/include/linux/compiler.h b/include/linux/compiler.h index de7942423836..0ed22e909caf 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -179,6 +179,13 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, #include +#ifdef CONFIG_KMSAN +void *__msan_memcpy(void *dst, const void *src, u64 size); +#define __DO_MEMCPY(res, p, size) __msan_memcpy(res, p, size) +#else +#define __DO_MEMCPY(res, p, size) __builtin_memcpy(res, p, size) +#endif + #define __READ_ONCE_SIZE \ ({ \ switch (size) { \ @@ -188,7 +195,7 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, case 8: *(__u64 *)res = *(volatile __u64 *)p; break; \ default: \ barrier(); \ - __builtin_memcpy((void *)res, (const void *)p, size); \ + __DO_MEMCPY((void *)res, (const void *)p, size); \ barrier(); \ } \ }) diff --git a/include/linux/string.h b/include/linux/string.h index 02894e417565..80d2a8d828fc 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -365,6 +365,7 @@ __FORTIFY_INLINE void *memset(void *p, int c, __kernel_size_t size) return __builtin_memset(p, c, size); } +#ifndef CONFIG_KMSAN __FORTIFY_INLINE void *memcpy(void *p, const void *q, __kernel_size_t size) { size_t p_size = __builtin_object_size(p, 0); @@ -379,6 +380,7 @@ __FORTIFY_INLINE void *memcpy(void *p, const void *q, __kernel_size_t size) fortify_panic(__func__); return __builtin_memcpy(p, q, size); } +#endif __FORTIFY_INLINE void *memmove(void *p, const void *q, __kernel_size_t size) { -- 2.24.1.735.g03f4e72817-goog