vserver 1.9.3
[linux-2.6.git] / arch / x86_64 / kernel / ldt.c
index c7d7dac..d7e5d0c 100644 (file)
@@ -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;
+
        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)
-       return err;
+               goto error_return;
        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;
+error_return:
+       return err;
 }
 
 static int read_default_ldt(void __user * ptr, unsigned long bytecount)