• Arnd Bergmann's avatar
    uaccess: generalize access_ok() · 12700c17
    Arnd Bergmann authored
    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: default avatarChristoph Hellwig <hch@lst.de>
    Acked-by: Mark Rutland <mark.rutland@arm.com> [arm64, asm-generic]
    Acked-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
    Acked-by: default avatarStafford Horne <shorne@gmail.com>
    Acked-by: default avatarDinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    12700c17
uaccess.h 16.7 KB