Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87d82483 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman
Browse files

nds32: fix access_ok() checks in get/put_user



commit 8926d88ced46700bf6117ceaf391480b943ea9f4 upstream.

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: 487913ab ("nds32: Extract the checking and getting pointer to a macro")
Cc: stable@vger.kernel.org @ v4.19+
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 273ebddc
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -75,9 +75,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);				\
@@ -90,6 +88,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);			\
@@ -170,12 +176,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;							\
})