提交 eb5399f9 编写于 作者: A Arnd Bergmann 提交者: Zheng Zengkai

nds32: fix access_ok() checks in get/put_user

stable inclusion
from stable-v5.10.109
commit 2b5a6d771450a6577eab0db18be6b91b75733df1
bugzilla: https://gitee.com/openeuler/kernel/issues/I574AE

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=2b5a6d771450a6577eab0db18be6b91b75733df1

--------------------------------

commit 8926d88c 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: NChristoph Hellwig <hch@lst.de>
Signed-off-by: NArnd Bergmann <arnd@arndb.de>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NYu Liao <liaoyu15@huawei.com>
Reviewed-by: NWei Li <liwei391@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 2de977a3
...@@ -70,9 +70,7 @@ static inline void set_fs(mm_segment_t fs) ...@@ -70,9 +70,7 @@ static inline void set_fs(mm_segment_t fs)
* versions are void (ie, don't return a value as such). * 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; \ long __gu_err = 0; \
__get_user_check((x), (ptr), __gu_err); \ __get_user_check((x), (ptr), __gu_err); \
...@@ -85,6 +83,14 @@ static inline void set_fs(mm_segment_t fs) ...@@ -85,6 +83,14 @@ static inline void set_fs(mm_segment_t fs)
(void)0; \ (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) \ #define __get_user_check(x, ptr, err) \
({ \ ({ \
const __typeof__(*(ptr)) __user *__p = (ptr); \ const __typeof__(*(ptr)) __user *__p = (ptr); \
...@@ -165,12 +171,18 @@ do { \ ...@@ -165,12 +171,18 @@ do { \
: "r"(addr), "i"(-EFAULT) \ : "r"(addr), "i"(-EFAULT) \
: "cc") : "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) \ #define __put_user(x, ptr) \
({ \ ({ \
long __pu_err = 0; \ 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; \ __pu_err; \
}) })
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册