Commit 07ad112a authored by Michael Ellerman's avatar Michael Ellerman

Merge KUAP fix from topic/uaccess-ppc into fixes

Merge a KUAP fix from Nick that we're keeping in a topic branch due to
interactions with other series that are headed for next.
parents 5990cdee d02f6b7d
...@@ -166,13 +166,17 @@ do { \ ...@@ -166,13 +166,17 @@ do { \
({ \ ({ \
long __pu_err; \ long __pu_err; \
__typeof__(*(ptr)) __user *__pu_addr = (ptr); \ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
__typeof__(*(ptr)) __pu_val = (x); \
__typeof__(size) __pu_size = (size); \
\
if (!is_kernel_addr((unsigned long)__pu_addr)) \ if (!is_kernel_addr((unsigned long)__pu_addr)) \
might_fault(); \ might_fault(); \
__chk_user_ptr(ptr); \ __chk_user_ptr(__pu_addr); \
if (do_allow) \ if (do_allow) \
__put_user_size((x), __pu_addr, (size), __pu_err); \ __put_user_size(__pu_val, __pu_addr, __pu_size, __pu_err); \
else \ else \
__put_user_size_allowed((x), __pu_addr, (size), __pu_err); \ __put_user_size_allowed(__pu_val, __pu_addr, __pu_size, __pu_err); \
\
__pu_err; \ __pu_err; \
}) })
...@@ -180,9 +184,13 @@ do { \ ...@@ -180,9 +184,13 @@ do { \
({ \ ({ \
long __pu_err = -EFAULT; \ long __pu_err = -EFAULT; \
__typeof__(*(ptr)) __user *__pu_addr = (ptr); \ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
__typeof__(*(ptr)) __pu_val = (x); \
__typeof__(size) __pu_size = (size); \
\
might_fault(); \ might_fault(); \
if (access_ok(__pu_addr, size)) \ if (access_ok(__pu_addr, __pu_size)) \
__put_user_size((x), __pu_addr, (size), __pu_err); \ __put_user_size(__pu_val, __pu_addr, __pu_size, __pu_err); \
\
__pu_err; \ __pu_err; \
}) })
...@@ -190,8 +198,12 @@ do { \ ...@@ -190,8 +198,12 @@ do { \
({ \ ({ \
long __pu_err; \ long __pu_err; \
__typeof__(*(ptr)) __user *__pu_addr = (ptr); \ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
__chk_user_ptr(ptr); \ __typeof__(*(ptr)) __pu_val = (x); \
__put_user_size((x), __pu_addr, (size), __pu_err); \ __typeof__(size) __pu_size = (size); \
\
__chk_user_ptr(__pu_addr); \
__put_user_size(__pu_val, __pu_addr, __pu_size, __pu_err); \
\
__pu_err; \ __pu_err; \
}) })
...@@ -283,15 +295,18 @@ do { \ ...@@ -283,15 +295,18 @@ do { \
long __gu_err; \ long __gu_err; \
__long_type(*(ptr)) __gu_val; \ __long_type(*(ptr)) __gu_val; \
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
__chk_user_ptr(ptr); \ __typeof__(size) __gu_size = (size); \
\
__chk_user_ptr(__gu_addr); \
if (!is_kernel_addr((unsigned long)__gu_addr)) \ if (!is_kernel_addr((unsigned long)__gu_addr)) \
might_fault(); \ might_fault(); \
barrier_nospec(); \ barrier_nospec(); \
if (do_allow) \ if (do_allow) \
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \
else \ else \
__get_user_size_allowed(__gu_val, __gu_addr, (size), __gu_err); \ __get_user_size_allowed(__gu_val, __gu_addr, __gu_size, __gu_err); \
(x) = (__typeof__(*(ptr)))__gu_val; \ (x) = (__typeof__(*(ptr)))__gu_val; \
\
__gu_err; \ __gu_err; \
}) })
...@@ -300,12 +315,15 @@ do { \ ...@@ -300,12 +315,15 @@ do { \
long __gu_err = -EFAULT; \ long __gu_err = -EFAULT; \
__long_type(*(ptr)) __gu_val = 0; \ __long_type(*(ptr)) __gu_val = 0; \
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
__typeof__(size) __gu_size = (size); \
\
might_fault(); \ might_fault(); \
if (access_ok(__gu_addr, (size))) { \ if (access_ok(__gu_addr, __gu_size)) { \
barrier_nospec(); \ barrier_nospec(); \
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \
} \ } \
(x) = (__force __typeof__(*(ptr)))__gu_val; \ (x) = (__force __typeof__(*(ptr)))__gu_val; \
\
__gu_err; \ __gu_err; \
}) })
...@@ -314,10 +332,13 @@ do { \ ...@@ -314,10 +332,13 @@ do { \
long __gu_err; \ long __gu_err; \
__long_type(*(ptr)) __gu_val; \ __long_type(*(ptr)) __gu_val; \
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
__chk_user_ptr(ptr); \ __typeof__(size) __gu_size = (size); \
\
__chk_user_ptr(__gu_addr); \
barrier_nospec(); \ barrier_nospec(); \
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \
(x) = (__force __typeof__(*(ptr)))__gu_val; \ (x) = (__force __typeof__(*(ptr)))__gu_val; \
\
__gu_err; \ __gu_err; \
}) })
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment