Skip to content

Commit 449bdbf

Browse files
chleroyintel-lab-lkp
authored andcommitted
powerpc/uaccess: Refactor get/put_user() and __get/put_user()
Make get_user() do the access_ok() check then call __get_user(). Make put_user() do the access_ok() check then call __put_user(). Then embed __get_user_size() and __put_user_size() in __get_user() and __put_user(). Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
1 parent fd87f9b commit 449bdbf

File tree

1 file changed

+23
-43
lines changed

1 file changed

+23
-43
lines changed

arch/powerpc/include/asm/uaccess.h

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,6 @@ static inline bool __access_ok(unsigned long addr, unsigned long size)
4343
* exception handling means that it's no longer "just"...)
4444
*
4545
*/
46-
#define __put_user_size(x, ptr, size, retval) \
47-
do { \
48-
__label__ __pu_failed; \
49-
\
50-
retval = 0; \
51-
allow_write_to_user(ptr, size); \
52-
__put_user_size_goto(x, ptr, size, __pu_failed); \
53-
prevent_write_to_user(ptr, size); \
54-
break; \
55-
\
56-
__pu_failed: \
57-
retval = -EFAULT; \
58-
prevent_write_to_user(ptr, size); \
59-
} while (0)
60-
6146
#define __put_user(x, ptr) \
6247
({ \
6348
long __pu_err; \
@@ -66,23 +51,29 @@ __pu_failed: \
6651
__typeof__(sizeof(*(ptr))) __pu_size = sizeof(*(ptr)); \
6752
\
6853
might_fault(); \
69-
__put_user_size(__pu_val, __pu_addr, __pu_size, __pu_err); \
54+
do { \
55+
__label__ __pu_failed; \
56+
\
57+
allow_write_to_user(__pu_addr, __pu_size); \
58+
__put_user_size_goto(__pu_val, __pu_addr, __pu_size, __pu_failed); \
59+
prevent_write_to_user(__pu_addr, __pu_size); \
60+
__pu_err = 0; \
61+
break; \
62+
\
63+
__pu_failed: \
64+
prevent_write_to_user(__pu_addr, __pu_size); \
65+
__pu_err = -EFAULT; \
66+
} while (0); \
7067
\
7168
__pu_err; \
7269
})
7370

7471
#define put_user(x, ptr) \
7572
({ \
76-
long __pu_err = -EFAULT; \
77-
__typeof__(*(ptr)) __user *__pu_addr = (ptr); \
78-
__typeof__(*(ptr)) __pu_val = (__typeof__(*(ptr)))(x); \
79-
__typeof__(sizeof(*(ptr))) __pu_size = sizeof(*(ptr)); \
73+
__typeof__(*(ptr)) __user *_pu_addr = (ptr); \
8074
\
81-
might_fault(); \
82-
if (access_ok(__pu_addr, __pu_size)) \
83-
__put_user_size(__pu_val, __pu_addr, __pu_size, __pu_err); \
84-
\
85-
__pu_err; \
75+
access_ok(_pu_addr, sizeof(*(ptr))) ? \
76+
__put_user(x, _pu_addr) : -EFAULT; \
8677
})
8778

8879
/*
@@ -192,13 +183,6 @@ do { \
192183
} \
193184
} while (0)
194185

195-
#define __get_user_size(x, ptr, size, retval) \
196-
do { \
197-
allow_read_from_user(ptr, size); \
198-
__get_user_size_allowed(x, ptr, size, retval); \
199-
prevent_read_from_user(ptr, size); \
200-
} while (0)
201-
202186
/*
203187
* This is a type: either unsigned long, if the argument fits into
204188
* that type, or otherwise unsigned long long.
@@ -214,25 +198,21 @@ do { \
214198
__typeof__(sizeof(*(ptr))) __gu_size = sizeof(*(ptr)); \
215199
\
216200
might_fault(); \
217-
__get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \
201+
allow_read_from_user(__gu_addr, __gu_size); \
202+
__get_user_size_allowed(__gu_val, __gu_addr, __gu_size, __gu_err); \
203+
prevent_read_from_user(__gu_addr, __gu_size); \
218204
(x) = (__typeof__(*(ptr)))__gu_val; \
219205
\
220206
__gu_err; \
221207
})
222208

223209
#define get_user(x, ptr) \
224210
({ \
225-
long __gu_err = -EFAULT; \
226-
__long_type(*(ptr)) __gu_val = 0; \
227-
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
228-
__typeof__(sizeof(*(ptr))) __gu_size = sizeof(*(ptr)); \
229-
\
230-
might_fault(); \
231-
if (access_ok(__gu_addr, __gu_size)) \
232-
__get_user_size(__gu_val, __gu_addr, __gu_size, __gu_err); \
233-
(x) = (__force __typeof__(*(ptr)))__gu_val; \
211+
__typeof__(*(ptr)) __user *_gu_addr = (ptr); \
234212
\
235-
__gu_err; \
213+
access_ok(_gu_addr, sizeof(*(ptr))) ? \
214+
__get_user(x, _gu_addr) : \
215+
((x) = (__force __typeof__(*(ptr)))0, -EFAULT); \
236216
})
237217

238218
/* more complex routines */

0 commit comments

Comments
 (0)