git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
arch
/
x86_64
/
lib
/
usercopy.c
diff --git
a/arch/x86_64/lib/usercopy.c
b/arch/x86_64/lib/usercopy.c
index
c83825e
..
893d43f
100644
(file)
--- a/
arch/x86_64/lib/usercopy.c
+++ b/
arch/x86_64/lib/usercopy.c
@@
-5,6
+5,7
@@
* Copyright 1997 Linus Torvalds
* Copyright 2002 Andi Kleen <ak@suse.de>
*/
* Copyright 1997 Linus Torvalds
* Copyright 2002 Andi Kleen <ak@suse.de>
*/
+#include <linux/module.h>
#include <asm/uaccess.h>
/*
#include <asm/uaccess.h>
/*
@@
-14,6
+15,7
@@
#define __do_strncpy_from_user(dst,src,count,res) \
do { \
long __d0, __d1, __d2; \
#define __do_strncpy_from_user(dst,src,count,res) \
do { \
long __d0, __d1, __d2; \
+ might_sleep(); \
__asm__ __volatile__( \
" testq %1,%1\n" \
" jz 2f\n" \
__asm__ __volatile__( \
" testq %1,%1\n" \
" jz 2f\n" \
@@
-46,15
+48,17
@@
__strncpy_from_user(char *dst, const char __user *src, long count)
__do_strncpy_from_user(dst, src, count, res);
return res;
}
__do_strncpy_from_user(dst, src, count, res);
return res;
}
+EXPORT_SYMBOL(__strncpy_from_user);
long
strncpy_from_user(char *dst, const char __user *src, long count)
{
long res = -EFAULT;
if (access_ok(VERIFY_READ, src, 1))
long
strncpy_from_user(char *dst, const char __user *src, long count)
{
long res = -EFAULT;
if (access_ok(VERIFY_READ, src, 1))
-
__do_strncpy_from_user(dst, src, count, res
);
+
return __strncpy_from_user(dst, src, count
);
return res;
}
return res;
}
+EXPORT_SYMBOL(strncpy_from_user);
/*
* Zero Userspace
/*
* Zero Userspace
@@
-63,6
+67,7
@@
strncpy_from_user(char *dst, const char __user *src, long count)
unsigned long __clear_user(void __user *addr, unsigned long size)
{
long __d0;
unsigned long __clear_user(void __user *addr, unsigned long size)
{
long __d0;
+ might_sleep();
/* no memory constraint because it doesn't change any memory gcc knows
about */
asm volatile(
/* no memory constraint because it doesn't change any memory gcc knows
about */
asm volatile(
@@
-92,7
+97,7
@@
unsigned long __clear_user(void __user *addr, unsigned long size)
[zero] "r" (0UL), [eight] "r" (8UL));
return size;
}
[zero] "r" (0UL), [eight] "r" (8UL));
return size;
}
-
+EXPORT_SYMBOL(__clear_user);
unsigned long clear_user(void __user *to, unsigned long n)
{
unsigned long clear_user(void __user *to, unsigned long n)
{
@@
-100,6
+105,7
@@
unsigned long clear_user(void __user *to, unsigned long n)
return __clear_user(to, n);
return n;
}
return __clear_user(to, n);
return n;
}
+EXPORT_SYMBOL(clear_user);
/*
* Return the size of a string (including the ending 0)
/*
* Return the size of a string (including the ending 0)
@@
-107,14
+113,11
@@
unsigned long clear_user(void __user *to, unsigned long n)
* Return 0 on exception, a value greater than N if too long
*/
* Return 0 on exception, a value greater than N if too long
*/
-long strnlen_user(const char __user *s, long n)
+long
__
strnlen_user(const char __user *s, long n)
{
long res = 0;
char c;
{
long res = 0;
char c;
- if (!access_ok(VERIFY_READ, s, n))
- return 0;
-
while (1) {
if (res>n)
return n+1;
while (1) {
if (res>n)
return n+1;
@@
-126,6
+129,15
@@
long strnlen_user(const char __user *s, long n)
s++;
}
}
s++;
}
}
+EXPORT_SYMBOL(__strnlen_user);
+
+long strnlen_user(const char __user *s, long n)
+{
+ if (!access_ok(VERIFY_READ, s, n))
+ return 0;
+ return __strnlen_user(s, n);
+}
+EXPORT_SYMBOL(strnlen_user);
long strlen_user(const char __user *s)
{
long strlen_user(const char __user *s)
{
@@
-141,11
+153,14
@@
long strlen_user(const char __user *s)
s++;
}
}
s++;
}
}
+EXPORT_SYMBOL(strlen_user);
unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len)
{
if (access_ok(VERIFY_WRITE, to, len) && access_ok(VERIFY_READ, from, len)) {
unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len)
{
if (access_ok(VERIFY_WRITE, to, len) && access_ok(VERIFY_READ, from, len)) {
- return copy_user_generic((
void *)to, (
void *)from, len);
+ return copy_user_generic((
__force void *)to, (__force
void *)from, len);
}
return len;
}
}
return len;
}
+EXPORT_SYMBOL(copy_in_user);
+