fcntl: return -EFAULT if copy_to_user fails
authorDan Carpenter <error27@gmail.com>
Thu, 3 Jun 2010 10:35:42 +0000 (12:35 +0200)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 4 Jun 2010 21:16:28 +0000 (17:16 -0400)
copy_to_user() returns the number of bytes remaining, but we want to
return -EFAULT.
ret = fcntl(fd, F_SETOWN_EX, NULL);
With the original code ret would be 8 here.

V2: Takuya Yoshikawa pointed out a similar issue in f_getown_ex()

Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/fcntl.c

index f74d270ba1554034b02c7532ece41556ca9040c0..51e11bf5708f2430cca213485d597ff070f228af 100644 (file)
@@ -274,7 +274,7 @@ static int f_setown_ex(struct file *filp, unsigned long arg)
 
        ret = copy_from_user(&owner, owner_p, sizeof(owner));
        if (ret)
-               return ret;
+               return -EFAULT;
 
        switch (owner.type) {
        case F_OWNER_TID:
@@ -332,8 +332,11 @@ static int f_getown_ex(struct file *filp, unsigned long arg)
        }
        read_unlock(&filp->f_owner.lock);
 
-       if (!ret)
+       if (!ret) {
                ret = copy_to_user(owner_p, &owner, sizeof(owner));
+               if (ret)
+                       ret = -EFAULT;
+       }
        return ret;
 }