|
@@ -358,17 +358,15 @@ idmap_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg,
|
|
char __user *dst, size_t buflen)
|
|
char __user *dst, size_t buflen)
|
|
{
|
|
{
|
|
char *data = (char *)msg->data + msg->copied;
|
|
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);
|
|
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;
|
|
mlen -= left;
|
|
msg->copied += mlen;
|
|
msg->copied += mlen;
|
|
msg->errno = 0;
|
|
msg->errno = 0;
|