[ARM] Fix get_user when passed a const pointer
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Fri, 18 Nov 2005 14:22:03 +0000 (14:22 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 18 Nov 2005 14:22:03 +0000 (14:22 +0000)
Unfortunately, later gcc versions error out when our get_user is passed
a const pointer, since we write to a temporary variable declared as
typeof(*(p)) which propagates the const-ness.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/armksyms.c
arch/arm/lib/getuser.S
include/asm-arm/uaccess.h

index 7a3261f0bf79012e158e81eab69e7f633d56b4c6..9997098009a9941ff63c025c23be09aa56b6ccbf 100644 (file)
@@ -120,7 +120,6 @@ EXPORT_SYMBOL(__arch_strncpy_from_user);
 EXPORT_SYMBOL(__get_user_1);
 EXPORT_SYMBOL(__get_user_2);
 EXPORT_SYMBOL(__get_user_4);
-EXPORT_SYMBOL(__get_user_8);
 
 EXPORT_SYMBOL(__put_user_1);
 EXPORT_SYMBOL(__put_user_2);
index d204018070a49bde08c2c32b610c8b9edef37b5b..c03ea8e666ba1906544fba96a62d58ce3e526ecf 100644 (file)
@@ -54,15 +54,6 @@ __get_user_4:
        mov     r0, #0
        mov     pc, lr
 
-       .global __get_user_8
-__get_user_8:
-5:     ldrt    r2, [r0], #4
-6:     ldrt    r3, [r0]
-       mov     r0, #0
-       mov     pc, lr
-
-__get_user_bad_8:
-       mov     r3, #0
 __get_user_bad:
        mov     r2, #0
        mov     r0, #-EFAULT
@@ -73,6 +64,4 @@ __get_user_bad:
        .long   2b, __get_user_bad
        .long   3b, __get_user_bad
        .long   4b, __get_user_bad
-       .long   5b, __get_user_bad_8
-       .long   6b, __get_user_bad_8
 .previous
index a2fdad0138b3e5bf2e7e2500e97a8821fe7b036e..064f0f5e8e2b9e3361082dbc420b2e6248263c40 100644 (file)
@@ -100,7 +100,6 @@ static inline void set_fs (mm_segment_t fs)
 extern int __get_user_1(void *);
 extern int __get_user_2(void *);
 extern int __get_user_4(void *);
-extern int __get_user_8(void *);
 extern int __get_user_bad(void);
 
 #define __get_user_x(__r2,__p,__e,__s,__i...)                          \
@@ -114,7 +113,7 @@ extern int __get_user_bad(void);
 #define get_user(x,p)                                                  \
        ({                                                              \
                const register typeof(*(p)) __user *__p asm("r0") = (p);\
-               register typeof(*(p)) __r2 asm("r2");                   \
+               register unsigned int __r2 asm("r2");                   \
                register int __e asm("r0");                             \
                switch (sizeof(*(__p))) {                               \
                case 1:                                                 \
@@ -126,12 +125,9 @@ extern int __get_user_bad(void);
                case 4:                                                 \
                        __get_user_x(__r2, __p, __e, 4, "lr");          \
                        break;                                          \
-               case 8:                                                 \
-                       __get_user_x(__r2, __p, __e, 8, "lr");          \
-                       break;                                          \
                default: __e = __get_user_bad(); break;                 \
                }                                                       \
-               x = __r2;                                               \
+               x = (typeof(*(p))) __r2;                                \
                __e;                                                    \
        })