powerpc/uaccess: Remove __chk_user_ptr() in __get/put_user
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Wed, 10 Mar 2021 17:46:48 +0000 (17:46 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sat, 3 Apr 2021 10:21:59 +0000 (21:21 +1100)
Commit d02f6b7dab82 ("powerpc/uaccess: Evaluate macro arguments once,
before user access is allowed") changed the __chk_user_ptr()
argument from the passed ptr pointer to the locally
declared __gu_addr. But __gu_addr is locally defined as __user
so the check is pointless.

During kernel build __chk_user_ptr() voids and is only evaluated
during sparse checks so it should have been armless to leave the
original pointer check there.

Nevertheless, this check is indeed redundant with the assignment
above which casts the ptr pointer to the local __user __gu_addr.
In case of mismatch, sparse will detect it there, so the
__check_user_ptr() is not needed anywhere else than in access_ok().

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/69f17d75046733b891ab2e668dbf464787cdf598.1615398265.git.christophe.leroy@csgroup.eu
arch/powerpc/include/asm/uaccess.h

index ea167ac..605fa79 100644 (file)
@@ -78,7 +78,6 @@ __pu_failed:                                                  \
        __typeof__(size) __pu_size = (size);                    \
                                                                \
        might_fault();                                          \
-       __chk_user_ptr(__pu_addr);                              \
        __put_user_size(__pu_val, __pu_addr, __pu_size, __pu_err);      \
                                                                \
        __pu_err;                                               \
@@ -197,7 +196,6 @@ extern long __get_user_bad(void);
 #define __get_user_size_allowed(x, ptr, size, retval)          \
 do {                                                           \
        retval = 0;                                             \
-       __chk_user_ptr(ptr);                                    \
        if (size > sizeof(x))                                   \
                (x) = __get_user_bad();                         \
        switch (size) {                                         \
@@ -230,7 +228,6 @@ do {                                                                \
        __typeof__(*(ptr)) __user *__gu_addr = (ptr);   \
        __typeof__(size) __gu_size = (size);                    \
                                                                \
-       __chk_user_ptr(__gu_addr);                              \
        if (do_allow) {                                                         \
                might_fault();                                  \
                __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err);      \