mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
vhost_net: fix OoB on sendmsg() failure.
commit3c4cea8fa7
upstream. If the sendmsg() call in vhost_tx_batch() fails, both the 'batched_xdp' and 'done_idx' indexes are left unchanged. If such failure happens when batched_xdp == VHOST_NET_BATCH, the next call to vhost_net_build_xdp() will access and write memory outside the xdp buffers area. Since sendmsg() can only error with EBADFD, this change addresses the issue explicitly freeing the XDP buffers batch on error. Fixes:0a0be13b8f
("vhost_net: batch submitting XDP buffers to underlayer sockets") Suggested-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7843861e21
commit
cad96d0e50
1 changed files with 10 additions and 1 deletions
|
@ -466,7 +466,7 @@ static void vhost_tx_batch(struct vhost_net *net,
|
|||
.num = nvq->batched_xdp,
|
||||
.ptr = nvq->xdp,
|
||||
};
|
||||
int err;
|
||||
int i, err;
|
||||
|
||||
if (nvq->batched_xdp == 0)
|
||||
goto signal_used;
|
||||
|
@ -475,6 +475,15 @@ static void vhost_tx_batch(struct vhost_net *net,
|
|||
err = sock->ops->sendmsg(sock, msghdr, 0);
|
||||
if (unlikely(err < 0)) {
|
||||
vq_err(&nvq->vq, "Fail to batch sending packets\n");
|
||||
|
||||
/* free pages owned by XDP; since this is an unlikely error path,
|
||||
* keep it simple and avoid more complex bulk update for the
|
||||
* used pages
|
||||
*/
|
||||
for (i = 0; i < nvq->batched_xdp; ++i)
|
||||
put_page(virt_to_head_page(nvq->xdp[i].data));
|
||||
nvq->batched_xdp = 0;
|
||||
nvq->done_idx = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue