Signed-off-by: Michael Walle <mich...@walle.cc>
---
 include/asm-generic/uaccess.h |   58 ++++++++++++++++++++++-------------------
 1 files changed, 31 insertions(+), 27 deletions(-)

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;                                        \
 })
 
-- 
1.7.2.3

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode
Twitter: www.twitter.com/milkymistvj
Ideas? http://milkymist.uservoice.com

Reply via email to