diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 1f2d85e869c0..6dac38792288 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
@@ -472,16 +472,15 @@ gss_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, | |||
472 | char __user *dst, size_t buflen) | 472 | char __user *dst, size_t buflen) |
473 | { | 473 | { |
474 | char *data = (char *)msg->data + msg->copied; | 474 | char *data = (char *)msg->data + msg->copied; |
475 | ssize_t mlen = msg->len; | 475 | size_t mlen = min(msg->len, buflen); |
476 | ssize_t left; | 476 | unsigned long left; |
477 | 477 | ||
478 | if (mlen > buflen) | ||
479 | mlen = buflen; | ||
480 | left = copy_to_user(dst, data, mlen); | 478 | left = copy_to_user(dst, data, mlen); |
481 | if (left < 0) { | 479 | if (left == mlen) { |
482 | msg->errno = left; | 480 | msg->errno = -EFAULT; |
483 | return left; | 481 | return -EFAULT; |
484 | } | 482 | } |
483 | |||
485 | mlen -= left; | 484 | mlen -= left; |
486 | msg->copied += mlen; | 485 | msg->copied += mlen; |
487 | msg->errno = 0; | 486 | msg->errno = 0; |