From: Arnd Bergmann <a...@arndb.de>

The get_user()/put_user() functions are meant to check for
access_ok(), while the __get_user()/__put_user() functions
don't.

This broke in 4.19 for nds32, when it gained an extraneous
check in __get_user(), but lost the check it needs in
__put_user().

Fixes: 487913ab18c2 ("nds32: Extract the checking and getting pointer to a 
macro")
Cc: sta...@vger.kernel.org @ v4.19+
Signed-off-by: Arnd Bergmann <a...@arndb.de>
---
 arch/nds32/include/asm/uaccess.h | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/arch/nds32/include/asm/uaccess.h b/arch/nds32/include/asm/uaccess.h
index d4cbf069dc22..37a40981deb3 100644
--- a/arch/nds32/include/asm/uaccess.h
+++ b/arch/nds32/include/asm/uaccess.h
@@ -70,9 +70,7 @@ static inline void set_fs(mm_segment_t fs)
  * versions are void (ie, don't return a value as such).
  */
 
-#define get_user       __get_user                                      \
-
-#define __get_user(x, ptr)                                             \
+#define get_user(x, ptr)                                               \
 ({                                                                     \
        long __gu_err = 0;                                              \
        __get_user_check((x), (ptr), __gu_err);                         \
@@ -85,6 +83,14 @@ static inline void set_fs(mm_segment_t fs)
        (void)0;                                                        \
 })
 
+#define __get_user(x, ptr)                                             \
+({                                                                     \
+       long __gu_err = 0;                                              \
+       const __typeof__(*(ptr)) __user *__p = (ptr);                   \
+       __get_user_err((x), __p, (__gu_err));                           \
+       __gu_err;                                                       \
+})
+
 #define __get_user_check(x, ptr, err)                                  \
 ({                                                                     \
        const __typeof__(*(ptr)) __user *__p = (ptr);                   \
@@ -165,12 +171,18 @@ do {                                                      
                \
                : "r"(addr), "i"(-EFAULT)                               \
                : "cc")
 
-#define put_user       __put_user                                      \
+#define put_user(x, ptr)                                               \
+({                                                                     \
+       long __pu_err = 0;                                              \
+       __put_user_check((x), (ptr), __pu_err);                         \
+       __pu_err;                                                       \
+})
 
 #define __put_user(x, ptr)                                             \
 ({                                                                     \
        long __pu_err = 0;                                              \
-       __put_user_err((x), (ptr), __pu_err);                           \
+       __typeof__(*(ptr)) __user *__p = (ptr);                         \
+       __put_user_err((x), __p, __pu_err);                             \
        __pu_err;                                                       \
 })
 
-- 
2.29.2

Reply via email to