@@ -75,54 +75,54 @@ static inline void set_fs(mm_segment_t fs)
75
75
* versions are void (ie, don't return a value as such).
76
76
*/
77
77
78
- #define get_user (x , ptr ) \
79
- ({ \
80
- long __e = -EFAULT; \
81
- const __typeof__(*(ptr)) __user *__p = (ptr); \
82
- if (likely(access_ok(VERIFY_READ, __p, sizeof(*__p)))) { \
83
- __e = __get_user(x, __p); \
84
- } else { \
85
- (x) = 0; \
86
- } \
87
- __e; \
88
- })
78
+ #define get_user __get_user \
89
79
90
80
#define __get_user (x , ptr ) \
91
81
({ \
92
82
long __gu_err = 0; \
93
- __get_user_err ((x), (ptr), __gu_err); \
83
+ __get_user_check ((x), (ptr), __gu_err); \
94
84
__gu_err; \
95
85
})
96
86
97
87
#define __get_user_error (x , ptr , err ) \
98
88
({ \
99
- __get_user_err ((x), (ptr), err); \
89
+ __get_user_check ((x), (ptr), ( err) ); \
100
90
(void)0; \
101
91
})
102
92
93
+ #define __get_user_check (x , ptr , err ) \
94
+ ({ \
95
+ const __typeof__(*(ptr)) __user *__p = (ptr); \
96
+ might_fault(); \
97
+ if (access_ok(VERIFY_READ, __p, sizeof(*__p))) { \
98
+ __get_user_err((x), __p, (err)); \
99
+ } else { \
100
+ (x) = 0; (err) = -EFAULT; \
101
+ } \
102
+ })
103
+
103
104
#define __get_user_err (x , ptr , err ) \
104
105
do { \
105
- const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
106
106
unsigned long __gu_val; \
107
- __chk_user_ptr(__gu_addr); \
108
- switch (sizeof(*(__gu_addr ))) { \
107
+ __chk_user_ptr(ptr); \
108
+ switch (sizeof(*(ptr ))) { \
109
109
case 1: \
110
- __get_user_asm("lbi", __gu_val, __gu_addr , (err)); \
110
+ __get_user_asm("lbi", __gu_val, (ptr) , (err)); \
111
111
break; \
112
112
case 2: \
113
- __get_user_asm("lhi", __gu_val, __gu_addr , (err)); \
113
+ __get_user_asm("lhi", __gu_val, (ptr) , (err)); \
114
114
break; \
115
115
case 4: \
116
- __get_user_asm("lwi", __gu_val, __gu_addr , (err)); \
116
+ __get_user_asm("lwi", __gu_val, (ptr) , (err)); \
117
117
break; \
118
118
case 8: \
119
- __get_user_asm_dword(__gu_val, __gu_addr , (err)); \
119
+ __get_user_asm_dword(__gu_val, (ptr) , (err)); \
120
120
break; \
121
121
default: \
122
122
BUILD_BUG(); \
123
123
break; \
124
124
} \
125
- (x) = (__typeof__(*(__gu_addr )))__gu_val; \
125
+ (x) = (__force __typeof__(*(ptr )))__gu_val; \
126
126
} while (0)
127
127
128
128
#define __get_user_asm (inst , x , addr , err ) \
@@ -170,15 +170,7 @@ do { \
170
170
: "r"(addr), "i"(-EFAULT) \
171
171
: "cc")
172
172
173
- #define put_user (x , ptr ) \
174
- ({ \
175
- long __e = -EFAULT; \
176
- __typeof__(*(ptr)) __user *__p = (ptr); \
177
- if (likely(access_ok(VERIFY_WRITE, __p, sizeof(*__p)))) { \
178
- __e = __put_user(x, __p); \
179
- } \
180
- __e; \
181
- })
173
+ #define put_user __put_user \
182
174
183
175
#define __put_user (x , ptr ) \
184
176
({ \
@@ -189,27 +181,37 @@ do { \
189
181
190
182
#define __put_user_error (x , ptr , err ) \
191
183
({ \
192
- __put_user_err((x), (ptr), err); \
184
+ __put_user_err((x), (ptr), ( err) ); \
193
185
(void)0; \
194
186
})
195
187
188
+ #define __put_user_check (x , ptr , err ) \
189
+ ({ \
190
+ __typeof__(*(ptr)) __user *__p = (ptr); \
191
+ might_fault(); \
192
+ if (access_ok(VERIFY_WRITE, __p, sizeof(*__p))) { \
193
+ __put_user_err((x), __p, (err)); \
194
+ } else { \
195
+ (err) = -EFAULT; \
196
+ } \
197
+ })
198
+
196
199
#define __put_user_err (x , ptr , err ) \
197
200
do { \
198
- __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
199
- __typeof__(*(__pu_addr)) __pu_val = (x); \
200
- __chk_user_ptr(__pu_addr); \
201
- switch (sizeof(*(__pu_addr))) { \
201
+ __typeof__(*(ptr)) __pu_val = (x); \
202
+ __chk_user_ptr(ptr); \
203
+ switch (sizeof(*(ptr))) { \
202
204
case 1: \
203
- __put_user_asm("sbi", __pu_val, __pu_addr , (err)); \
205
+ __put_user_asm("sbi", __pu_val, (ptr) , (err)); \
204
206
break; \
205
207
case 2: \
206
- __put_user_asm("shi", __pu_val, __pu_addr , (err)); \
208
+ __put_user_asm("shi", __pu_val, (ptr) , (err)); \
207
209
break; \
208
210
case 4: \
209
- __put_user_asm("swi", __pu_val, __pu_addr , (err)); \
211
+ __put_user_asm("swi", __pu_val, (ptr) , (err)); \
210
212
break; \
211
213
case 8: \
212
- __put_user_asm_dword(__pu_val, __pu_addr , (err)); \
214
+ __put_user_asm_dword(__pu_val, (ptr) , (err)); \
213
215
break; \
214
216
default: \
215
217
BUILD_BUG(); \
0 commit comments