diff options
author | Stefano Garzarella <sgarzare@redhat.com> | 2022-02-28 10:50:58 +0100 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2022-03-06 05:08:23 -0500 |
commit | 8d1b247f3748ac4078524130c6d7ae42b6140aaf (patch) | |
tree | 8cf5d1d82e20ca7d479801b5e5d8e9baa9f24229 /hw/virtio | |
parent | 4ccd5fe22feb95137d325f422016a6473541fe9f (diff) | |
download | qemu-8d1b247f3748ac4078524130c6d7ae42b6140aaf.zip qemu-8d1b247f3748ac4078524130c6d7ae42b6140aaf.tar.gz qemu-8d1b247f3748ac4078524130c6d7ae42b6140aaf.tar.bz2 |
vhost-vsock: detach the virqueue element in case of error
In vhost_vsock_common_send_transport_reset(), if an element popped from
the virtqueue is invalid, we should call virtqueue_detach_element() to
detach it from the virtqueue before freeing its memory.
Fixes: fc0b9b0e1c ("vhost-vsock: add virtio sockets device")
Fixes: CVE-2022-26354
Cc: qemu-stable@nongnu.org
Reported-by: VictorV <vv474172261@gmail.com>
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Message-Id: <20220228095058.27899-1-sgarzare@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/virtio')
-rw-r--r-- | hw/virtio/vhost-vsock-common.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/hw/virtio/vhost-vsock-common.c b/hw/virtio/vhost-vsock-common.c index 3f37712..ed70668 100644 --- a/hw/virtio/vhost-vsock-common.c +++ b/hw/virtio/vhost-vsock-common.c @@ -153,19 +153,23 @@ static void vhost_vsock_common_send_transport_reset(VHostVSockCommon *vvc) if (elem->out_num) { error_report("invalid vhost-vsock event virtqueue element with " "out buffers"); - goto out; + goto err; } if (iov_from_buf(elem->in_sg, elem->in_num, 0, &event, sizeof(event)) != sizeof(event)) { error_report("vhost-vsock event virtqueue element is too short"); - goto out; + goto err; } virtqueue_push(vq, elem, sizeof(event)); virtio_notify(VIRTIO_DEVICE(vvc), vq); -out: + g_free(elem); + return; + +err: + virtqueue_detach_element(vq, elem, 0); g_free(elem); } |