Commit 3c4cea8f authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

vhost_net: fix OoB on sendmsg() failure.

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: 0a0be13b ("vhost_net: batch submitting XDP buffers to underlayer sockets")
Suggested-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 276aae37
...@@ -467,7 +467,7 @@ static void vhost_tx_batch(struct vhost_net *net, ...@@ -467,7 +467,7 @@ static void vhost_tx_batch(struct vhost_net *net,
.num = nvq->batched_xdp, .num = nvq->batched_xdp,
.ptr = nvq->xdp, .ptr = nvq->xdp,
}; };
int err; int i, err;
if (nvq->batched_xdp == 0) if (nvq->batched_xdp == 0)
goto signal_used; goto signal_used;
...@@ -476,6 +476,15 @@ static void vhost_tx_batch(struct vhost_net *net, ...@@ -476,6 +476,15 @@ static void vhost_tx_batch(struct vhost_net *net,
err = sock->ops->sendmsg(sock, msghdr, 0); err = sock->ops->sendmsg(sock, msghdr, 0);
if (unlikely(err < 0)) { if (unlikely(err < 0)) {
vq_err(&nvq->vq, "Fail to batch sending packets\n"); 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; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment