Thread (4 messages) 4 messages, 2 authors, 2021-08-30

Re: [PATCH v3 0/5] Enable -Warray-bounds and -Wzero-length-bounds

From: Nathan Chancellor <nathan@kernel.org>
Date: 2021-08-30 18:44:59
Also in: linux-hardening, lkml

On Fri, Aug 27, 2021 at 09:30:10AM -0700, Kees Cook wrote:
v3:
- fix typo in treewide conversion (u8 should have been __u8)
- improve changelog for DECLARE_FLEX_ARRAY patch
- add acks/reviews
v2: https://lore.kernel.org/lkml/20210826050458.1540622-1-keescook@chromium.org/ (local)
v1: https://lore.kernel.org/lkml/20210818081118.1667663-1-keescook@chromium.org/ (local)

Hi,

In support of the improved buffer overflow detection for memcpy(),
this enables -Warray-bounds and -Wzero-length-bounds globally. Mostly
it involves some struct member tricks with the new DECLARE_FLEX_ARRAY()
macro. Everything else is just replacing stacked 0-element arrays
with actual unions in two related treewide patches. There is one set of
special cases that were fixed separately[1] and are needed as well.

I'm expecting to carry this series with the memcpy() series in my
"overflow" tree. Reviews appreciated! :)
Hi Kees,

I ran this series through my local build tests and uncovered two
warnings in the same file that appear to be unhandled as of
next-20210830. This is from ARCH=powerpc pseries_defconfig with
clang-14, I did not try earlier versions of clang.

arch/powerpc/kernel/signal_32.c:780:2: error: array index 3 is past the end of the array (which contains 1 element) [-Werror,-Warray-bounds]
        unsafe_put_sigset_t(&frame->uc.uc_sigmask, oldset, failed);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kernel/signal_32.c:85:29: note: expanded from macro 'unsafe_put_sigset_t'
#define unsafe_put_sigset_t     unsafe_put_compat_sigset
                                ^
./include/linux/compat.h:455:19: note: expanded from macro 'unsafe_put_compat_sigset'
                unsafe_put_user(__s->sig[3] >> 32, &__c->sig[7], label);        \
                                ^        ~
./arch/powerpc/include/asm/uaccess.h:426:42: note: expanded from macro 'unsafe_put_user'
        __put_user_size_goto((__typeof__(*(p)))(x), (p), sizeof(*(p)), e)
                                                ^
./arch/powerpc/include/asm/uaccess.h:114:30: note: expanded from macro '__put_user_size_goto'
        case 1: __put_user_asm_goto(x, __pus_addr, label, "stb"); break;        \
                                    ^
./arch/powerpc/include/asm/uaccess.h:89:10: note: expanded from macro '__put_user_asm_goto'
                : "r" (x), "m"UPD_CONSTR (*addr)                \
                       ^
./include/linux/compiler_types.h:254:42: note: expanded from macro 'asm_volatile_goto'
#define asm_volatile_goto(x...) asm goto(x)
                                         ^
./arch/powerpc/include/uapi/asm/signal.h:18:2: note: array 'sig' declared here
        unsigned long sig[_NSIG_WORDS];
        ^
arch/powerpc/kernel/signal_32.c:1044:3: error: array index 2 is past the end of the array (which contains 1 element) [-Werror,-Warray-bounds]
                unsafe_put_sigset_t(&old_ctx->uc_sigmask, &current->blocked, failed);
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kernel/signal_32.c:85:29: note: expanded from macro 'unsafe_put_sigset_t'
#define unsafe_put_sigset_t     unsafe_put_compat_sigset
                                ^
./include/linux/compat.h:459:19: note: expanded from macro 'unsafe_put_compat_sigset'
                unsafe_put_user(__s->sig[2] >> 32, &__c->sig[5], label);        \
                                ^        ~
./arch/powerpc/include/asm/uaccess.h:426:42: note: expanded from macro 'unsafe_put_user'
        __put_user_size_goto((__typeof__(*(p)))(x), (p), sizeof(*(p)), e)
                                                ^
./arch/powerpc/include/asm/uaccess.h:116:30: note: expanded from macro '__put_user_size_goto'
        case 4: __put_user_asm_goto(x, __pus_addr, label, "stw"); break;        \
                                    ^
./arch/powerpc/include/asm/uaccess.h:89:10: note: expanded from macro '__put_user_asm_goto'
                : "r" (x), "m"UPD_CONSTR (*addr)                \
                       ^
./include/linux/compiler_types.h:254:42: note: expanded from macro 'asm_volatile_goto'
#define asm_volatile_goto(x...) asm goto(x)
                                         ^
./arch/powerpc/include/uapi/asm/signal.h:18:2: note: array 'sig' declared here
        unsigned long sig[_NSIG_WORDS];
        ^

Cheers,
Nathan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help