MN10300: Proper use of macros get_user() in the case of incremented pointers
authorTkhai Kirill <tkhai@yandex.ru>
Mon, 14 Mar 2011 13:27:46 +0000 (13:27 +0000)
committerDavid Howells <dhowells@redhat.com>
Mon, 14 Mar 2011 14:44:30 +0000 (14:44 +0000)
Using __get_user_check(x, ptr++, size) leads to double increment of pointer.
This macro uses the macro get_user directly, which itself is used in this way
(get_user(x, ptr++)) in some functions of the kernel. The patch fixes the
error.

Reported-by: Tkhai Kirill <tkhai@yandex.ru>
Signed-off-by: David Howells <dhowells@redhat.com>
arch/mn10300/include/asm/uaccess.h

index 679dee0..3d6e60d 100644 (file)
@@ -160,9 +160,10 @@ struct __large_struct { unsigned long buf[100]; };
 
 #define __get_user_check(x, ptr, size)                                 \
 ({                                                                     \
+       const __typeof__(ptr) __guc_ptr = (ptr);                        \
        int _e;                                                         \
-       if (likely(__access_ok((unsigned long) (ptr), (size))))         \
-               _e = __get_user_nocheck((x), (ptr), (size));            \
+       if (likely(__access_ok((unsigned long) __guc_ptr, (size))))     \
+               _e = __get_user_nocheck((x), __guc_ptr, (size));        \
        else {                                                          \
                _e = -EFAULT;                                           \
                (x) = (__typeof__(x))0;                                 \