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