diff options
author | Christophe Leroy <christophe.leroy@csgroup.eu> | 2021-03-10 17:46:50 +0000 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2021-04-03 21:22:05 +1100 |
commit | f904c22f2a9fb09fe705efdedbe4af9a30bdf633 (patch) | |
tree | 6dc39a27b94d83767f467741124d55d26faed06c | |
parent | 9975f852ce1bf041a1a81bf882e29ee7a3b78ca6 (diff) |
powerpc/uaccess: Split out __get_user_nocheck()
One part of __get_user_nocheck() is used for __get_user(),
the other part for unsafe_get_user().
Move the part dedicated to unsafe_get_user() in it.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/618fe2e0626b308a5a063d5baac827b968e85c32.1615398265.git.christophe.leroy@csgroup.eu
-rw-r--r-- | arch/powerpc/include/asm/uaccess.h | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h index 47a454d19351..2395bdc991bd 100644 --- a/arch/powerpc/include/asm/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h @@ -49,7 +49,7 @@ static inline bool __access_ok(unsigned long addr, unsigned long size) __put_user_check((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) #define __get_user(x, ptr) \ - __get_user_nocheck((x), (ptr), sizeof(*(ptr)), true) + __get_user_nocheck((x), (ptr), sizeof(*(ptr))) #define __put_user(x, ptr) \ __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) @@ -216,19 +216,15 @@ do { \ #define __long_type(x) \ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) -#define __get_user_nocheck(x, ptr, size, do_allow) \ +#define __get_user_nocheck(x, ptr, size) \ ({ \ long __gu_err; \ __long_type(*(ptr)) __gu_val; \ __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __typeof__(size) __gu_size = (size); \ \ - if (do_allow) { \ - might_fault(); \ - __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \ - } else { \ - __get_user_size_allowed(__gu_val, __gu_addr, __gu_size, __gu_err); \ - } \ + might_fault(); \ + __get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ \ __gu_err; \ @@ -385,8 +381,14 @@ user_write_access_begin(const void __user *ptr, size_t len) #define user_write_access_end prevent_current_write_to_user #define unsafe_get_user(x, p, e) do { \ - if (unlikely(__get_user_nocheck((x), (p), sizeof(*(p)), false)))\ - goto e; \ + long __gu_err; \ + __long_type(*(p)) __gu_val; \ + __typeof__(*(p)) __user *__gu_addr = (p); \ + \ + __get_user_size_allowed(__gu_val, __gu_addr, sizeof(*(p)), __gu_err); \ + if (__gu_err) \ + goto e; \ + (x) = (__typeof__(*(p)))__gu_val; \ } while (0) #define unsafe_put_user(x, p, e) \ |