|
@@ -7,6 +7,7 @@
|
|
|
#include <asm/page.h>
|
|
|
#include <asm/system.h>
|
|
|
#include <asm/cache.h>
|
|
|
+#include <asm/errno.h>
|
|
|
#include <asm-generic/uaccess-unaligned.h>
|
|
|
|
|
|
#define VERIFY_READ 0
|
|
@@ -234,13 +235,35 @@ extern long lstrnlen_user(const char __user *,long);
|
|
|
|
|
|
unsigned long copy_to_user(void __user *dst, const void *src, unsigned long len);
|
|
|
#define __copy_to_user copy_to_user
|
|
|
-unsigned long copy_from_user(void *dst, const void __user *src, unsigned long len);
|
|
|
-#define __copy_from_user copy_from_user
|
|
|
+unsigned long __copy_from_user(void *dst, const void __user *src, unsigned long len);
|
|
|
unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned long len);
|
|
|
#define __copy_in_user copy_in_user
|
|
|
#define __copy_to_user_inatomic __copy_to_user
|
|
|
#define __copy_from_user_inatomic __copy_from_user
|
|
|
|
|
|
+extern void copy_from_user_overflow(void)
|
|
|
+#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
|
|
+ __compiletime_error("copy_from_user() buffer size is not provably correct")
|
|
|
+#else
|
|
|
+ __compiletime_warning("copy_from_user() buffer size is not provably correct")
|
|
|
+#endif
|
|
|
+;
|
|
|
+
|
|
|
+static inline unsigned long __must_check copy_from_user(void *to,
|
|
|
+ const void __user *from,
|
|
|
+ unsigned long n)
|
|
|
+{
|
|
|
+ int sz = __compiletime_object_size(to);
|
|
|
+ int ret = -EFAULT;
|
|
|
+
|
|
|
+ if (likely(sz == -1 || !__builtin_constant_p(n) || sz >= n))
|
|
|
+ ret = __copy_from_user(to, from, n);
|
|
|
+ else
|
|
|
+ copy_from_user_overflow();
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
struct pt_regs;
|
|
|
int fixup_exception(struct pt_regs *regs);
|
|
|
|