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
vserver 1.9.3
[linux-2.6.git]
/
arch
/
x86_64
/
kernel
/
ldt.c
diff --git
a/arch/x86_64/kernel/ldt.c
b/arch/x86_64/kernel/ldt.c
index
c7d7dac
..
d7e5d0c
100644
(file)
--- a/
arch/x86_64/kernel/ldt.c
+++ b/
arch/x86_64/kernel/ldt.c
@@
-135,6
+135,7
@@
static int read_ldt(void __user * ptr, unsigned long bytecount)
return 0;
if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES)
bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
return 0;
if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES)
bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
+
down(&mm->context.sem);
size = mm->context.size*LDT_ENTRY_SIZE;
if (size > bytecount)
down(&mm->context.sem);
size = mm->context.size*LDT_ENTRY_SIZE;
if (size > bytecount)
@@
-145,12
+146,17
@@
static int read_ldt(void __user * ptr, unsigned long bytecount)
err = -EFAULT;
up(&mm->context.sem);
if (err < 0)
err = -EFAULT;
up(&mm->context.sem);
if (err < 0)
-
return err
;
+
goto error_return
;
if (size != bytecount) {
/* zero-fill the rest */
if (size != bytecount) {
/* zero-fill the rest */
- clear_user(ptr+size, bytecount-size);
+ if (clear_user(ptr+size, bytecount-size) != 0) {
+ err = -EFAULT;
+ goto error_return;
+ }
}
return bytecount;
}
return bytecount;
+error_return:
+ return err;
}
static int read_default_ldt(void __user * ptr, unsigned long bytecount)
}
static int read_default_ldt(void __user * ptr, unsigned long bytecount)