|
@@ -1354,6 +1354,7 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
|
|
|
|
|
|
ret = tun_do_read(tun, tfile, iv, len,
|
|
|
file->f_flags & O_NONBLOCK);
|
|
|
+ ret = min_t(ssize_t, ret, len);
|
|
|
if (ret > 0)
|
|
|
iocb->ki_pos = ret;
|
|
|
out:
|
|
@@ -1454,6 +1455,10 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
}
|
|
|
ret = tun_do_read(tun, tfile, m->msg_iov, total_len,
|
|
|
flags & MSG_DONTWAIT);
|
|
|
+ if (ret > total_len) {
|
|
|
+ m->msg_flags |= MSG_TRUNC;
|
|
|
+ ret = flags & MSG_TRUNC ? ret : total_len;
|
|
|
+ }
|
|
|
out:
|
|
|
tun_put(tun);
|
|
|
return ret;
|