Re: Fwd: [EXTERNAL] Re: ioctl.c:undefined reference to `__get_user_bad'
From: Randy Dunlap <rdunlap@infradead.org>
Date: 2021-05-17 21:06:35
[adding back linux-arm-kernel; what happened to it? ] On 5/17/21 2:04 PM, Randy Dunlap wrote:
On 5/17/21 10:13 AM, Steve French wrote:quoted
quoted
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <redacted> All errors (new ones prefixed by >>): arm-linux-gnueabi-ld: fs/cifs/ioctl.o: in function `cifs_dump_full_key':quoted
quoted
ioctl.c:(.text+0x44): undefined reference to `__get_user_bad'<snip>quoted
# CONFIG_MMU is not set and arch/arm/include/asm/uaccess.h does not implement get_user(size 8 bytes) for the non-MMU case:I see another place in fs/cifs/ioctl.c where we already had been doing a get_user() into a u64 - any idea what you are supposed to do instead? Any example code where people have worked around this.Hi Steve, This change in cifs_dump_full_key() makes it build OK: - if (get_user(suid, (__u64 __user *)arg)) + if (get_user(suid, (unsigned int __user *)arg)) That is what the other call uses: case FS_IOC_SETFLAGS: cifs_dbg(VFS, "cifs ioctl FS_IOC_SETFLAGS:\n"); if (pSMBFile == NULL) break; tcon = tlink_tcon(pSMBFile->tlink); caps = le64_to_cpu(tcon->fsUnixInfo.Capability); if (get_user(ExtAttrBits, (int __user *)arg)) { rc = -EFAULT; break; } However, my reading/understanding is that the one immediately above is incorrect, as is the -/+ patch above it, since get_user() gets its data size (1, 2, 4, 8) from the type of the pointer that is passed to it. For 8 bytes (64 bits), 'int' is not sufficient, so IMO the get_user() call that builds: if (get_user(ExtAttrBits, (int __user *)arg)) { is a bug. It should be: if (get_user(ExtAttrBits, (__u64 __user *)arg)) { and if I make that latter change in the source file, the build says: arm-linux-gnueabi-ld: fs/cifs/ioctl.o: in function `cifs_dump_full_key': ioctl.c:(.text+0x14): undefined reference to `__get_user_bad' arm-linux-gnueabi-ld: fs/cifs/ioctl.o: in function `cifs_ioctl': ioctl.c:(.text+0x1f2): undefined reference to `__get_user_bad' so now both of them fail on the get_user() of 8 bytes. Hope that clarifies things. It tells me that arm no-MMU still needs support for get_user() of size 8 bytes.
-- ~Randy _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel