|
@@ -783,14 +783,18 @@ static int pppol2tp_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
err = 0;
|
|
|
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
|
|
|
flags & MSG_DONTWAIT, &err);
|
|
|
- if (skb) {
|
|
|
- err = memcpy_toiovec(msg->msg_iov, (unsigned char *) skb->data,
|
|
|
- skb->len);
|
|
|
- if (err < 0)
|
|
|
- goto do_skb_free;
|
|
|
- err = skb->len;
|
|
|
- }
|
|
|
-do_skb_free:
|
|
|
+ if (!skb)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if (len > skb->len)
|
|
|
+ len = skb->len;
|
|
|
+ else if (len < skb->len)
|
|
|
+ msg->msg_flags |= MSG_TRUNC;
|
|
|
+
|
|
|
+ err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, len);
|
|
|
+ if (likely(err == 0))
|
|
|
+ err = len;
|
|
|
+
|
|
|
kfree_skb(skb);
|
|
|
end:
|
|
|
return err;
|