uaccess: generalize access_ok()
authorArnd Bergmann <arnd@arndb.de>
Tue, 15 Feb 2022 16:55:04 +0000 (17:55 +0100)
committerArnd Bergmann <arnd@arndb.de>
Fri, 25 Feb 2022 08:36:05 +0000 (09:36 +0100)
commit12700c17fc286149324f92d6d380bc48e43f253d
tree63157067b99d0adec5db4058ab9235b4802d1e49
parent23fc539e81295b14b50c6ccc5baeb4f3d59d822d
uaccess: generalize access_ok()

There are many different ways that access_ok() is defined across
architectures, but in the end, they all just compare against the
user_addr_max() value or they accept anything.

Provide one definition that works for most architectures, checking
against TASK_SIZE_MAX for user processes or skipping the check inside
of uaccess_kernel() sections.

For architectures without CONFIG_SET_FS(), this should be the fastest
check, as it comes down to a single comparison of a pointer against a
compile-time constant, while the architecture specific versions tend to
do something more complex for historic reasons or get something wrong.

Type checking for __user annotations is handled inconsistently across
architectures, but this is easily simplified as well by using an inline
function that takes a 'const void __user *' argument. A handful of
callers need an extra __user annotation for this.

Some architectures had trick to use 33-bit or 65-bit arithmetic on the
addresses to calculate the overflow, however this simpler version uses
fewer registers, which means it can produce better object code in the
end despite needing a second (statically predicted) branch.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Acked-by: Mark Rutland <mark.rutland@arm.com> [arm64, asm-generic]
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Stafford Horne <shorne@gmail.com>
Acked-by: Dinh Nguyen <dinguyen@kernel.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
32 files changed:
arch/Kconfig
arch/alpha/include/asm/uaccess.h
arch/arc/include/asm/uaccess.h
arch/arm/include/asm/uaccess.h
arch/arm64/include/asm/uaccess.h
arch/csky/include/asm/uaccess.h
arch/hexagon/include/asm/uaccess.h
arch/ia64/include/asm/uaccess.h
arch/m68k/Kconfig.cpu
arch/m68k/include/asm/uaccess.h
arch/microblaze/include/asm/uaccess.h
arch/mips/include/asm/uaccess.h
arch/nds32/include/asm/uaccess.h
arch/nios2/include/asm/uaccess.h
arch/openrisc/include/asm/uaccess.h
arch/parisc/Kconfig
arch/parisc/include/asm/uaccess.h
arch/powerpc/include/asm/uaccess.h
arch/riscv/include/asm/uaccess.h
arch/s390/Kconfig
arch/s390/include/asm/uaccess.h
arch/sh/include/asm/uaccess.h
arch/sparc/Kconfig
arch/sparc/include/asm/uaccess.h
arch/sparc/include/asm/uaccess_32.h
arch/sparc/include/asm/uaccess_64.h
arch/um/include/asm/uaccess.h
arch/x86/include/asm/uaccess.h
arch/xtensa/include/asm/uaccess.h
include/asm-generic/access_ok.h [new file with mode: 0644]
include/asm-generic/uaccess.h
include/linux/uaccess.h