[PATCH] Add __must_check to copy_*_user
authorAndi Kleen <ak@suse.de>
Tue, 26 Sep 2006 08:52:39 +0000 (10:52 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Tue, 26 Sep 2006 08:52:39 +0000 (10:52 +0200)
Following i386.

And also fix the two occurrences that caused warnings in arch/x86_64/*

Signed-off-by: Andi Kleen <ak@suse.de>
arch/x86_64/ia32/ptrace32.c
include/asm-x86_64/i387.h
include/asm-x86_64/uaccess.h

index 72bf92a9d37502ce8f33b521371a1e98cfc5ee4a..d18198ed636b59d006bb3b87e68ea0bc50e87ff7 100644 (file)
@@ -375,8 +375,10 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
                ret = -EIO;
                if (!access_ok(VERIFY_READ, u, sizeof(*u)))
                        break;
-               /* no checking to be bug-to-bug compatible with i386 */
-               __copy_from_user(&child->thread.i387.fxsave, u, sizeof(*u));
+               /* no checking to be bug-to-bug compatible with i386. */
+               /* but silence warning */
+               if (__copy_from_user(&child->thread.i387.fxsave, u, sizeof(*u)))
+                       ;
                set_stopped_child_used_math(child);
                child->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
                ret = 0; 
index 60c0f4853fdbd26e5a43461266614d269b440222..0217b74cc9fc0cd30456d40929e6196229680178 100644 (file)
@@ -137,8 +137,8 @@ static inline int save_i387_checking(struct i387_fxsave_struct __user *fx)
 #else
                     : [fx] "cdaSDb" (fx), "0" (0));
 #endif
-       if (unlikely(err))
-               __clear_user(fx, sizeof(struct i387_fxsave_struct));
+       if (unlikely(err) && __clear_user(fx, sizeof(struct i387_fxsave_struct)))
+               err = -EFAULT;
        /* No need to clear here because the caller clears USED_MATH */
        return err;
 } 
index bc6812009bd73cdd78c3794f79d4f1954a0c2067..802a4a068ef60304e7229046c623c17291b9d8d5 100644 (file)
@@ -237,14 +237,18 @@ do {                                                                      \
  */
 
 /* Handles exceptions in both to and from, but doesn't do access_ok */
-extern unsigned long copy_user_generic(void *to, const void *from, unsigned len); 
-extern unsigned long copy_user_generic_dontzero(void *to, const void *from, unsigned len);
-
-extern unsigned long copy_to_user(void __user *to, const void *from, unsigned len); 
-extern unsigned long copy_from_user(void *to, const void __user *from, unsigned len); 
-extern unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len); 
-
-static __always_inline int __copy_from_user(void *dst, const void __user *src, unsigned size)
+__must_check unsigned long
+copy_user_generic(void *to, const void *from, unsigned len);
+
+__must_check unsigned long
+copy_to_user(void __user *to, const void *from, unsigned len);
+__must_check unsigned long
+copy_from_user(void *to, const void __user *from, unsigned len);
+__must_check unsigned long
+copy_in_user(void __user *to, const void __user *from, unsigned len);
+
+static __always_inline __must_check
+int __copy_from_user(void *dst, const void __user *src, unsigned size)
 { 
        int ret = 0;
        if (!__builtin_constant_p(size))
@@ -273,7 +277,8 @@ static __always_inline int __copy_from_user(void *dst, const void __user *src, u
        }
 }      
 
-static __always_inline int __copy_to_user(void __user *dst, const void *src, unsigned size)
+static __always_inline __must_check
+int __copy_to_user(void __user *dst, const void *src, unsigned size)
 { 
        int ret = 0;
        if (!__builtin_constant_p(size))
@@ -304,7 +309,8 @@ static __always_inline int __copy_to_user(void __user *dst, const void *src, uns
        }
 }      
 
-static __always_inline int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+static __always_inline __must_check
+int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
 { 
        int ret = 0;
        if (!__builtin_constant_p(size))
@@ -344,15 +350,17 @@ static __always_inline int __copy_in_user(void __user *dst, const void __user *s
        }
 }      
 
-long strncpy_from_user(char *dst, const char __user *src, long count);
-long __strncpy_from_user(char *dst, const char __user *src, long count);
-long strnlen_user(const char __user *str, long n);
-long __strnlen_user(const char __user *str, long n);
-long strlen_user(const char __user *str);
-unsigned long clear_user(void __user *mem, unsigned long len);
-unsigned long __clear_user(void __user *mem, unsigned long len);
-
-extern long __copy_from_user_inatomic(void *dst, const void __user *src, unsigned size);
+__must_check long 
+strncpy_from_user(char *dst, const char __user *src, long count);
+__must_check long 
+__strncpy_from_user(char *dst, const char __user *src, long count);
+__must_check long strnlen_user(const char __user *str, long n);
+__must_check long __strnlen_user(const char __user *str, long n);
+__must_check long strlen_user(const char __user *str);
+__must_check unsigned long clear_user(void __user *mem, unsigned long len);
+__must_check unsigned long __clear_user(void __user *mem, unsigned long len);
+
+__must_check long __copy_from_user_inatomic(void *dst, const void __user *src, unsigned size);
 #define __copy_to_user_inatomic copy_user_generic
 
 #endif /* __X86_64_UACCESS_H */