diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h index b218b85..fb9887a 100644 --- a/include/asm-generic/uaccess.h +++ b/include/asm-generic/uaccess.h @@ -142,16 +142,17 @@ static inline __must_check long __copy_to_user(void __user *to, */ #define __put_user(x, ptr) \ ({ \ - __typeof__(*(ptr)) __x = (x); \ + __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ + __typeof__(*(ptr)) __pu_val = (x); \ int __pu_err = -EFAULT; \ - __chk_user_ptr(ptr); \ - switch (sizeof (*(ptr))) { \ + __chk_user_ptr(__pu_addr); \ + switch (sizeof (*(__pu_addr))) { \ case 1: \ case 2: \ case 4: \ case 8: \ - __pu_err = __put_user_fn(sizeof (*(ptr)), \ - ptr, &__x); \ + __pu_err = __put_user_fn(sizeof (*(__pu_addr)), \ + __pu_addr, &__pu_val); \ break; \ default: \ __put_user_bad(); \ @@ -162,9 +163,10 @@ static inline __must_check long __copy_to_user(void __user *to, #define put_user(x, ptr) \ ({ \ + __typeof__(*(ptr)) __user *__Pu_addr = (ptr); \ might_sleep(); \ - access_ok(VERIFY_WRITE, ptr, sizeof(*ptr)) ? \ - __put_user(x, ptr) : \ + access_ok(VERIFY_WRITE, __Pu_addr, sizeof(*__Pu_addr)) ?\ + __put_user(x, __Pu_addr) : \ -EFAULT; \ }) @@ -178,35 +180,36 @@ extern int __put_user_bad(void) __attribute__((noreturn)); #define __get_user(x, ptr) \ ({ \ + const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ int __gu_err = -EFAULT; \ - __chk_user_ptr(ptr); \ - switch (sizeof(*(ptr))) { \ + __chk_user_ptr(__gu_addr); \ + switch (sizeof(*__gu_addr)) { \ case 1: { \ - unsigned char __x; \ - __gu_err = __get_user_fn(sizeof (*(ptr)), \ - ptr, &__x); \ - (x) = *(__force __typeof__(*(ptr)) *) &__x; \ + unsigned char __gu_val; \ + __gu_err = __get_user_fn(sizeof (*__gu_addr), \ + __gu_addr, &__gu_val); \ + (x) = *(__force __typeof__(*__gu_addr) *) &__gu_val; \ break; \ }; \ case 2: { \ - unsigned short __x; \ - __gu_err = __get_user_fn(sizeof (*(ptr)), \ - ptr, &__x); \ - (x) = *(__force __typeof__(*(ptr)) *) &__x; \ + unsigned short __gu_val; \ + __gu_err = __get_user_fn(sizeof (*__gu_addr), \ + __gu_addr, &__gu_val); \ + (x) = *(__force __typeof__(*__gu_addr) *) &__gu_val; \ break; \ }; \ case 4: { \ - unsigned int __x; \ - __gu_err = __get_user_fn(sizeof (*(ptr)), \ - ptr, &__x); \ - (x) = *(__force __typeof__(*(ptr)) *) &__x; \ + unsigned int __gu_val; \ + __gu_err = __get_user_fn(sizeof (*__gu_addr), \ + __gu_addr, &__gu_val); \ + (x) = *(__force __typeof__(*__gu_addr) *) &__gu_val; \ break; \ }; \ case 8: { \ - unsigned long long __x; \ - __gu_err = __get_user_fn(sizeof (*(ptr)), \ - ptr, &__x); \ - (x) = *(__force __typeof__(*(ptr)) *) &__x; \ + unsigned long long __gu_val; \ + __gu_err = __get_user_fn(sizeof (*__gu_addr), \ + __gu_addr, &__gu_val); \ + (x) = *(__force __typeof__(*__gu_addr) *) &__gu_val; \ break; \ }; \ default: \ @@ -218,9 +221,10 @@ extern int __put_user_bad(void) __attribute__((noreturn)); #define get_user(x, ptr) \ ({ \ + const __typeof__(*(ptr)) __user *__Gu_addr = (ptr); \ might_sleep(); \ - access_ok(VERIFY_READ, ptr, sizeof(*ptr)) ? \ - __get_user(x, ptr) : \ + access_ok(VERIFY_READ, __Gu_addr, sizeof(*__Gu_addr)) ? \ + __get_user(x, __Gu_addr) : \ -EFAULT; \ })