|
48 | 48 | /* Ensure that the range from addr to addr+size is all within the process' |
49 | 49 | * address space |
50 | 50 | */ |
51 | | -#define __range_ok(addr, size) (size <= get_fs() && addr <= (get_fs()-size)) |
| 51 | +static inline int __range_ok(unsigned long addr, unsigned long size) |
| 52 | +{ |
| 53 | + const mm_segment_t fs = get_fs(); |
52 | 54 |
|
53 | | -/* Ensure that addr is below task's addr_limit */ |
54 | | -#define __addr_ok(addr) ((unsigned long) addr < get_fs()) |
| 55 | + return size <= fs && addr <= (fs - size); |
| 56 | +} |
55 | 57 |
|
56 | 58 | #define access_ok(addr, size) \ |
57 | 59 | ({ \ |
58 | | - unsigned long __ao_addr = (unsigned long)(addr); \ |
59 | | - unsigned long __ao_size = (unsigned long)(size); \ |
60 | | - __range_ok(__ao_addr, __ao_size); \ |
| 60 | + __chk_user_ptr(addr); \ |
| 61 | + __range_ok((unsigned long)(addr), (size)); \ |
61 | 62 | }) |
62 | 63 |
|
63 | 64 | /* |
@@ -100,7 +101,7 @@ extern long __put_user_bad(void); |
100 | 101 | #define __put_user_check(x, ptr, size) \ |
101 | 102 | ({ \ |
102 | 103 | long __pu_err = -EFAULT; \ |
103 | | - __typeof__(*(ptr)) *__pu_addr = (ptr); \ |
| 104 | + __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ |
104 | 105 | if (access_ok(__pu_addr, size)) \ |
105 | 106 | __put_user_size((x), __pu_addr, (size), __pu_err); \ |
106 | 107 | __pu_err; \ |
@@ -173,7 +174,7 @@ struct __large_struct { |
173 | 174 | #define __get_user_check(x, ptr, size) \ |
174 | 175 | ({ \ |
175 | 176 | long __gu_err = -EFAULT, __gu_val = 0; \ |
176 | | - const __typeof__(*(ptr)) * __gu_addr = (ptr); \ |
| 177 | + const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ |
177 | 178 | if (access_ok(__gu_addr, size)) \ |
178 | 179 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ |
179 | 180 | (x) = (__force __typeof__(*(ptr)))__gu_val; \ |
@@ -241,17 +242,17 @@ raw_copy_from_user(void *to, const void __user *from, unsigned long size) |
241 | 242 | return __copy_tofrom_user(to, (__force const void *)from, size); |
242 | 243 | } |
243 | 244 | static inline unsigned long |
244 | | -raw_copy_to_user(void *to, const void __user *from, unsigned long size) |
| 245 | +raw_copy_to_user(void __user *to, const void *from, unsigned long size) |
245 | 246 | { |
246 | 247 | return __copy_tofrom_user((__force void *)to, from, size); |
247 | 248 | } |
248 | 249 | #define INLINE_COPY_FROM_USER |
249 | 250 | #define INLINE_COPY_TO_USER |
250 | 251 |
|
251 | | -extern unsigned long __clear_user(void *addr, unsigned long size); |
| 252 | +extern unsigned long __clear_user(void __user *addr, unsigned long size); |
252 | 253 |
|
253 | 254 | static inline __must_check unsigned long |
254 | | -clear_user(void *addr, unsigned long size) |
| 255 | +clear_user(void __user *addr, unsigned long size) |
255 | 256 | { |
256 | 257 | if (likely(access_ok(addr, size))) |
257 | 258 | size = __clear_user(addr, size); |
|
0 commit comments