When skb_copy_datagram_iovec called to fetch queued data
it may fail with EFAULT and if MSG_PEEK set by a caller
the position get advanced even if data hasn't been read.
So we might loose data bits here on subsequent recvmsg
calls. Instead lets exit early with error.

In sake of https://jira.sw.ru/browse/PSBM-57921

CC: Andrey Vagin <ava...@openvz.org>
Signed-off-by: Cyrill Gorcunov <gorcu...@openvz.org>
---
 net/netlink/af_netlink.c |    4 ++++
 1 file changed, 4 insertions(+)

Index: linux-pcs7.git/net/netlink/af_netlink.c
===================================================================
--- linux-pcs7.git.orig/net/netlink/af_netlink.c
+++ linux-pcs7.git/net/netlink/af_netlink.c
@@ -2473,6 +2473,10 @@ static int netlink_recvmsg(struct kiocb
 
        skb_reset_transport_header(data_skb);
        err = skb_copy_datagram_iovec(data_skb, skip, msg->msg_iov, copied);
+       if (err) {
+               skb_free_datagram(sk, skb);
+               goto out;
+       }
 
        if (flags & MSG_PEEK)
                sk_peek_offset_fwd(sk, copied);
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to