@@ -78,8 +78,9 @@ static inline void set_fs(mm_segment_t fs)
7878#define get_user (x ,p ) \
7979({ \
8080 long __e = -EFAULT; \
81- if(likely(access_ok(VERIFY_READ, p, sizeof(*p)))) { \
82- __e = __get_user(x,p); \
81+ const __typeof__(*(p)) __user *__p = (p); \
82+ if(likely(access_ok(VERIFY_READ, __p, sizeof(*__p)))) { \
83+ __e = __get_user(x, __p); \
8384 } else \
8485 x = 0; \
8586 __e; \
@@ -99,10 +100,10 @@ static inline void set_fs(mm_segment_t fs)
99100
100101#define __get_user_err (x ,ptr ,err ) \
101102do { \
102- unsigned long __gu_addr = (unsigned long)( ptr); \
103+ const __typeof__(*(ptr)) __user * __gu_addr = (ptr); \
103104 unsigned long __gu_val; \
104- __chk_user_ptr(ptr); \
105- switch (sizeof(*(ptr ))) { \
105+ __chk_user_ptr(__gu_addr); \
106+ switch (sizeof(*(__gu_addr ))) { \
106107 case 1: \
107108 __get_user_asm("lbi",__gu_val,__gu_addr,err); \
108109 break; \
@@ -119,7 +120,7 @@ do { \
119120 BUILD_BUG(); \
120121 break; \
121122 } \
122- (x) = (__typeof__(*(ptr )))__gu_val; \
123+ (x) = (__typeof__(*(__gu_addr )))__gu_val; \
123124} while (0)
124125
125126#define __get_user_asm (inst ,x ,addr ,err ) \
@@ -169,8 +170,9 @@ do { \
169170#define put_user (x ,p ) \
170171({ \
171172 long __e = -EFAULT; \
172- if(likely(access_ok(VERIFY_WRITE, p, sizeof(*p)))) { \
173- __e = __put_user(x,p); \
173+ __typeof__(*(p)) __user *__p = (p); \
174+ if(likely(access_ok(VERIFY_WRITE, __p, sizeof(*__p)))) { \
175+ __e = __put_user(x, __p); \
174176 } \
175177 __e; \
176178})
@@ -189,10 +191,10 @@ do { \
189191
190192#define __put_user_err (x ,ptr ,err ) \
191193do { \
192- unsigned long __pu_addr = (unsigned long) (ptr); \
193- __typeof__(*(ptr )) __pu_val = (x); \
194- __chk_user_ptr(ptr); \
195- switch (sizeof(*(ptr ))) { \
194+ __typeof__(*(ptr)) __user * __pu_addr = (ptr); \
195+ __typeof__(*(__pu_addr )) __pu_val = (x); \
196+ __chk_user_ptr(__pu_addr); \
197+ switch (sizeof(*(__pu_addr ))) { \
196198 case 1: \
197199 __put_user_asm("sbi",__pu_val,__pu_addr,err); \
198200 break; \
0 commit comments