|
@@ -1471,14 +1471,17 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
if (!tun)
|
|
|
return -EBADFD;
|
|
|
|
|
|
- if (flags & ~(MSG_DONTWAIT|MSG_TRUNC))
|
|
|
- return -EINVAL;
|
|
|
+ if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
ret = tun_do_read(tun, tfile, iocb, 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;
|
|
|
}
|