The commit is pushed to "branch-rh7-3.10.0-514.10.2.vz7.29.x-ovz" and will 
appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.10.2.vz7.29.6
------>
commit 959f2bcf808c3fc6ebbe5d7f1b5fce826a235d74
Author: Cyrill Gorcunov <gorcu...@virtuozzo.com>
Date:   Mon Mar 27 16:42:12 2017 +0400

    netlink: Don't manipulate @sk_peek_off if data fetching failed
    
    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
    
    Signed-off-by: Cyrill Gorcunov <gorcu...@openvz.org>
    Acked-by: Andrey Vagin <ava...@virtuozzo.com>
---
 net/netlink/af_netlink.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 68795fb..d0af224 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2483,11 +2483,12 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct 
socket *sock,
 
        skb_reset_transport_header(data_skb);
        err = skb_copy_datagram_iovec(data_skb, skip, msg->msg_iov, copied);
-
-       if (flags & MSG_PEEK)
-               sk_peek_offset_fwd(sk, copied);
-       else
-               sk_peek_offset_bwd(sk, skb->len);
+       if (!err) {
+               if (flags & MSG_PEEK)
+                       sk_peek_offset_fwd(sk, copied);
+               else
+                       sk_peek_offset_bwd(sk, skb->len);
+       }
 
        if (msg->msg_name) {
                struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name;
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to