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 29, 2019 at 4:13 PM Andrey Konovalov <andreyknvl@xxxxxxxxxx> wrote:
>
> 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?
Hm, interesting.
Looks like I simply forgot to add memset() and memmove(). Could have
costed us some false negatives.
> >
> > Bootloader must still the default string functions to avoid crashes.
>
> must still use
Ack
>
> >
> > 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
> >



-- 
Alexander Potapenko
Software Engineer

Google Germany GmbH
Erika-Mann-Straße, 33
80636 München

Geschäftsführer: Paul Manicle, Halimah DeLaine Prado
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg





[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