lkml.org 
[lkml]   [2021]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 35/64] fortify: Detect struct member overflows in memmove() at compile-time
    Date
    As done for memcpy(), also update memmove() to use the same tightened
    compile-time checks under CONFIG_FORTIFY_SOURCE.

    Signed-off-by: Kees Cook <keescook@chromium.org>
    ---
    arch/x86/boot/compressed/misc.c | 3 ++-
    arch/x86/lib/memcpy_32.c | 1 +
    include/linux/fortify-string.h | 21 ++++---------------
    .../read_overflow2_field-memmove.c | 5 +++++
    .../write_overflow_field-memmove.c | 5 +++++
    5 files changed, 17 insertions(+), 18 deletions(-)
    create mode 100644 lib/test_fortify/read_overflow2_field-memmove.c
    create mode 100644 lib/test_fortify/write_overflow_field-memmove.c

    diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
    index 743f13ea25c1..83ff4354970e 100644
    --- a/arch/x86/boot/compressed/misc.c
    +++ b/arch/x86/boot/compressed/misc.c
    @@ -34,10 +34,11 @@
    * try to define their own functions if these are not defined as macros.
    */
    #define memzero(s, n) memset((s), 0, (n))
    +#ifndef memmove
    #define memmove memmove
    -
    /* Functions used by the included decompressor code below. */
    void *memmove(void *dest, const void *src, size_t n);
    +#endif

    /*
    * This is set up by the setup-routine at boot-time
    diff --git a/arch/x86/lib/memcpy_32.c b/arch/x86/lib/memcpy_32.c
    index e565d1c9019e..f19b7fd07f04 100644
    --- a/arch/x86/lib/memcpy_32.c
    +++ b/arch/x86/lib/memcpy_32.c
    @@ -4,6 +4,7 @@

    #undef memcpy
    #undef memset
    +#undef memmove

    __visible void *memcpy(void *to, const void *from, size_t n)
    {
    diff --git a/include/linux/fortify-string.h b/include/linux/fortify-string.h
    index 5e79e626172b..2ffa5224aaac 100644
    --- a/include/linux/fortify-string.h
    +++ b/include/linux/fortify-string.h
    @@ -284,22 +284,10 @@ __FORTIFY_INLINE void fortify_memcpy_chk(__kernel_size_t size,
    __builtin_object_size(p, 0), __builtin_object_size(q, 0), \
    __builtin_object_size(p, 1), __builtin_object_size(q, 1), \
    memcpy)
    -
    -__FORTIFY_INLINE void *memmove(void *p, const void *q, __kernel_size_t size)
    -{
    - size_t p_size = __builtin_object_size(p, 0);
    - size_t q_size = __builtin_object_size(q, 0);
    -
    - if (__builtin_constant_p(size)) {
    - if (p_size < size)
    - __write_overflow();
    - if (q_size < size)
    - __read_overflow2();
    - }
    - if (p_size < size || q_size < size)
    - fortify_panic(__func__);
    - return __underlying_memmove(p, q, size);
    -}
    +#define memmove(p, q, s) __fortify_memcpy_chk(p, q, s, \
    + __builtin_object_size(p, 0), __builtin_object_size(q, 0), \
    + __builtin_object_size(p, 1), __builtin_object_size(q, 1), \
    + memmove)

    extern void *__real_memscan(void *, int, __kernel_size_t) __RENAME(memscan);
    __FORTIFY_INLINE void *memscan(void *p, int c, __kernel_size_t size)
    @@ -385,7 +373,6 @@ __FORTIFY_INLINE char *strcpy(char *p, const char *q)
    /* Don't use these outside the FORITFY_SOURCE implementation */
    #undef __underlying_memchr
    #undef __underlying_memcmp
    -#undef __underlying_memmove
    #undef __underlying_memset
    #undef __underlying_strcat
    #undef __underlying_strcpy
    diff --git a/lib/test_fortify/read_overflow2_field-memmove.c b/lib/test_fortify/read_overflow2_field-memmove.c
    new file mode 100644
    index 000000000000..6cc2724c8f62
    --- /dev/null
    +++ b/lib/test_fortify/read_overflow2_field-memmove.c
    @@ -0,0 +1,5 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +#define TEST \
    + memmove(large, instance.buf, sizeof(instance.buf) + 1)
    +
    +#include "test_fortify.h"
    diff --git a/lib/test_fortify/write_overflow_field-memmove.c b/lib/test_fortify/write_overflow_field-memmove.c
    new file mode 100644
    index 000000000000..377fcf9bb2fd
    --- /dev/null
    +++ b/lib/test_fortify/write_overflow_field-memmove.c
    @@ -0,0 +1,5 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +#define TEST \
    + memmove(instance.buf, large, sizeof(instance.buf) + 1)
    +
    +#include "test_fortify.h"
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-07-27 23:20    [W:3.517 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site