• Kees Cook's avatar
    rapidio: avoid bogus __alloc_size warning · 75da0eba
    Kees Cook authored
    Patch series "Add __alloc_size()", v3.
    
    GCC and Clang both use the "alloc_size" attribute to assist with bounds
    checking around the use of allocation functions.  Add the attribute,
    adjust the Makefile to silence needless warnings, and add the hints to
    the allocators where possible.  These changes have been in use for a
    while now in GrapheneOS.
    
    This patch (of 8):
    
    After adding __alloc_size attributes to the allocators, GCC 9.3 (but not
    later) may incorrectly evaluate the arguments to check_copy_size(),
    getting seemingly confused by the size being returned from array_size().
    Instead, perform the calculation once, which both makes the code more
    readable and avoids the bug in GCC.
    
       In file included from arch/x86/include/asm/preempt.h:7,
                        from include/linux/preempt.h:78,
                        from include/linux/spinlock.h:55,
                        from include/linux/mm_types.h:9,
                        from include/linux/buildid.h:5,
                        from include/linux/module.h:14,
                        from drivers/rapidio/devices/rio_mport_cdev.c:13:
       In function 'check_copy_size',
           inlined from 'copy_from_user' at include/linux/uaccess.h:191:6,
           inlined from 'rio_mport_transfer_ioctl' at drivers/rapidio/devices/rio_mport_cdev.c:983:6:
       include/linux/thread_info.h:213:4: error: call to '__bad_copy_to' declared with attribute error: copy destination size is too small
         213 |    __bad_copy_to();
             |    ^~~~~~~~~~~~~~~
    
    But the allocation size and the copy size are identical:
    
    	transfer = vmalloc(array_size(sizeof(*transfer), transaction.count));
    	if (!transfer)
    		return -ENOMEM;
    
    	if (unlikely(copy_from_user(transfer,
    				    (void __user *)(uintptr_t)transaction.block,
    				    array_size(sizeof(*transfer), transaction.count)))) {
    
    Link: https://lkml.kernel.org/r/20210930222704.2631604-1-keescook@chromium.org
    Link: https://lkml.kernel.org/r/20210930222704.2631604-2-keescook@chromium.org
    Link: https://lore.kernel.org/linux-mm/202109091134.FHnRmRxu-lkp@intel.com/Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
    Reported-by: default avatarkernel test robot <lkp@intel.com>
    Cc: Matt Porter <mporter@kernel.crashing.org>
    Cc: Alexandre Bounine <alex.bou9@gmail.com>
    Cc: Jing Xiangfeng <jingxiangfeng@huawei.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Cc: Souptick Joarder <jrdr.linux@gmail.com>
    Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    Cc: Andy Whitcroft <apw@canonical.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Daniel Micay <danielmicay@gmail.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Dennis Zhou <dennis@kernel.org>
    Cc: Dwaipayan Ray <dwaipayanray1@gmail.com>
    Cc: Joe Perches <joe@perches.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Cc: Miguel Ojeda <ojeda@kernel.org>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Randy Dunlap <rdunlap@infradead.org>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    75da0eba
rio_mport_cdev.c 64.8 KB