lkml.org 
[lkml]   [2021]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 060/168] vhost_net: fix OoB on sendmsg() failure.
    Date
    From: Paolo Abeni <pabeni@redhat.com>

    commit 3c4cea8fa7f71f00c5279547043a84bc2a4d8b8c 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: 0a0be13b8fe2 ("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>
    ---
    drivers/vhost/net.c | 11 ++++++++++-
    1 file changed, 10 insertions(+), 1 deletion(-)

    --- a/drivers/vhost/net.c
    +++ b/drivers/vhost/net.c
    @@ -467,7 +467,7 @@ static void vhost_tx_batch(struct vhost_
    .num = nvq->batched_xdp,
    .ptr = nvq->xdp,
    };
    - int err;
    + int i, err;

    if (nvq->batched_xdp == 0)
    goto signal_used;
    @@ -476,6 +476,15 @@ static void vhost_tx_batch(struct vhost_
    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;
    }


    \
     
     \ /
      Last update: 2021-09-20 20:46    [W:8.012 / U:0.624 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site