Re: [PATCH RFC v3 26/36] kmsan: use __msan_memcpy() where possible.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Nov 22, 2019 at 12:27 PM <glider@xxxxxxxxxx> wrote:
>
> Unless stated otherwise (by explicitly calling __memcpy()) we want all
> memcpy() calls to call __msan_memcpy() so that shadow and origin values
> are updated accordingly.

Why do we only do this for memcpy() but not for memove() and others?

>
> Bootloader must still the default string functions to avoid crashes.

must still use

>
> Signed-off-by: Alexander Potapenko <glider@xxxxxxxxxx>
> To: Alexander Potapenko <glider@xxxxxxxxxx>
> Cc: Vegard Nossum <vegard.nossum@xxxxxxxxxx>
> Cc: Dmitry Vyukov <dvyukov@xxxxxxxxxx>
> Cc: linux-mm@xxxxxxxxx
> ---
> v3:
>  - use default string functions in the bootloader
>
> Change-Id: Ib2512ce5aa8d457453dd38caa12f58f002166813
> ---
>  arch/x86/boot/compressed/misc.h  | 1 +
>  arch/x86/include/asm/string_64.h | 9 ++++++++-
>  include/linux/compiler.h         | 9 ++++++++-
>  include/linux/string.h           | 2 ++
>  4 files changed, 19 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..d3c76d910c23 100644
> --- a/arch/x86/include/asm/string_64.h
> +++ b/arch/x86/include/asm/string_64.h
> @@ -11,7 +11,13 @@
>     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
> @@ -64,7 +70,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
> diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> index 99d40f31a2c3..9ce11f4f4cb2 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 <uapi/linux/types.h>
>
> +#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 b6ccdc2c7f02..5d8ce09cba2e 100644
> --- a/include/linux/string.h
> +++ b/include/linux/string.h
> @@ -363,6 +363,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);
> @@ -377,6 +378,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.0.432.g9d3f5f5b63-goog
>




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux