Re: [linux-next:master 12105/12116] include/linux/thread_info.h:213:4: error: call to '__bad_copy_to' declared with attribute error: copy destination size is too small
From: Kees Cook <hidden>
Date: 2021-09-09 15:54:01
Also in:
oe-kbuild-all
On Thu, Sep 09, 2021 at 08:45:56AM -0700, Kees Cook wrote:
On Thu, Sep 09, 2021 at 11:49:55AM +0800, kernel test robot wrote:quoted
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 999569d59a0aa2509ae4a67ecc266c1134e37e7b commit: f5b1a5d922d3199e0637349239b43aed6c7656b9 [12105/12116] mm/vmalloc: add __alloc_size attributes for better bounds checking config: i386-randconfig-a002-20200329 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=f5b1a5d922d3199e0637349239b43aed6c7656b9 git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git fetch --no-tags linux-next master git checkout f5b1a5d922d3199e0637349239b43aed6c7656b9 # save the attached .config to linux build tree mkdir build_dir make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/rapidio/devices/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <redacted> All errors (new ones prefixed by >>): 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:quoted
quoted
include/linux/thread_info.h:213:4: error: call to '__bad_copy_to' declared with attribute error: copy destination size is too small213 | __bad_copy_to(); | ^~~~~~~~~~~~~~~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)))) { Uhhhmm... allocation size and copy size are identical... array_size(sizeof(*transfer), transaction.count) array_size(sizeof(*transfer), transaction.count)
This appears to be an optimization(?) bug in GCC 9.3. This warning (correctly) does not appear in later versions. -- Kees Cook