Messages in this thread | | | Date | Mon, 30 Aug 2021 11:44:54 -0700 | From | Nathan Chancellor <> | Subject | Re: [PATCH v3 0/5] Enable -Warray-bounds and -Wzero-length-bounds |
| |
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/ > v1: https://lore.kernel.org/lkml/20210818081118.1667663-1-keescook@chromium.org/ > > 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, ¤t->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
| |