lkml.org 
[lkml]   [2020]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH -tip 2/2] compiler_types.h: Add __no_sanitize_{address,undefined} to noinstr
    From
    Adds the portable definitions for __no_sanitize_address, and
    __no_sanitize_undefined, and subsequently changes noinstr to use the
    attributes to disable instrumentation via KASAN or UBSAN.

    Link: https://lore.kernel.org/lkml/000000000000d2474c05a6c938fe@google.com/
    Reported-by: syzbot+dc1fa714cb070b184db5@syzkaller.appspotmail.com
    Signed-off-by: Marco Elver <elver@google.com>
    ---

    Note: __no_sanitize_coverage (for KCOV) isn't possible right now,
    because neither GCC nor Clang support such an attribute. This means
    going and changing the compilers again (for Clang it's fine, for GCC,
    it'll take a while).

    However, it looks like that KCOV_INSTRUMENT := n is currently in all the
    right places. Short-term, this should be reasonable.
    ---
    include/linux/compiler-clang.h | 8 ++++++++
    include/linux/compiler-gcc.h | 6 ++++++
    include/linux/compiler_types.h | 3 ++-
    3 files changed, 16 insertions(+), 1 deletion(-)

    diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
    index 2cb42d8bdedc..c0e4b193b311 100644
    --- a/include/linux/compiler-clang.h
    +++ b/include/linux/compiler-clang.h
    @@ -33,6 +33,14 @@
    #define __no_sanitize_thread
    #endif

    +#if __has_feature(undefined_behavior_sanitizer)
    +/* GCC does not have __SANITIZE_UNDEFINED__ */
    +#define __no_sanitize_undefined \
    + __attribute__((no_sanitize("undefined")))
    +#else
    +#define __no_sanitize_undefined
    +#endif
    +
    /*
    * Not all versions of clang implement the the type-generic versions
    * of the builtin overflow checkers. Fortunately, clang implements
    diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
    index 7dd4e0349ef3..1c74464c80c6 100644
    --- a/include/linux/compiler-gcc.h
    +++ b/include/linux/compiler-gcc.h
    @@ -150,6 +150,12 @@
    #define __no_sanitize_thread
    #endif

    +#if __has_attribute(__no_sanitize_undefined__)
    +#define __no_sanitize_undefined __attribute__((no_sanitize_undefined))
    +#else
    +#define __no_sanitize_undefined
    +#endif
    +
    #if GCC_VERSION >= 50100
    #define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
    #endif
    diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
    index 02becd21d456..89b8c1ae18a1 100644
    --- a/include/linux/compiler_types.h
    +++ b/include/linux/compiler_types.h
    @@ -198,7 +198,8 @@ struct ftrace_likely_data {

    /* Section for code which can't be instrumented at all */
    #define noinstr \
    - noinline notrace __attribute((__section__(".noinstr.text"))) __no_kcsan
    + noinline notrace __attribute((__section__(".noinstr.text"))) \
    + __no_kcsan __no_sanitize_address __no_sanitize_undefined

    #endif /* __KERNEL__ */

    --
    2.27.0.rc2.251.g90737beb825-goog
    \
     
     \ /
      Last update: 2020-06-02 20:44    [W:3.093 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site