NFS: Fix use of copy_to_user() in idmap_pipe_upcall
authorChuck Lever <chuck.lever@oracle.com>
Thu, 20 Dec 2007 19:54:42 +0000 (14:54 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 30 Jan 2008 07:06:01 +0000 (02:06 -0500)
The idmap_pipe_upcall() function expects the copy_to_user() function to
return a negative error value if the call fails, but copy_to_user()
returns an unsigned long number of bytes that couldn't be copied.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/idmap.c

index c56fc7d..d93e071 100644 (file)
@@ -358,17 +358,15 @@ idmap_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg,
                  char __user *dst, size_t buflen)
 {
        char *data = (char *)msg->data + msg->copied;
-       ssize_t mlen = msg->len - msg->copied;
-       ssize_t left;
-
-       if (mlen > buflen)
-               mlen = buflen;
+       size_t mlen = min(msg->len, buflen);
+       unsigned long left;
 
        left = copy_to_user(dst, data, mlen);
-       if (left < 0) {
-               msg->errno = left;
-               return left;
+       if (left == mlen) {
+               msg->errno = -EFAULT;
+               return -EFAULT;
        }
+
        mlen -= left;
        msg->copied += mlen;
        msg->errno = 0;