]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
virtio-snd: fix max_size bounds check in input cb
authorManos Pitsidianakis <manos.pitsidianakis@linaro.org>
Fri, 20 Feb 2026 09:40:15 +0000 (11:40 +0200)
committerMichael S. Tsirkin <mst@redhat.com>
Fri, 20 Feb 2026 18:04:45 +0000 (13:04 -0500)
In 98e77e3d we calculated the max size and checked that each buffer is smaller than it.

We neglected to subtract the size of the virtio_snd_pcm_status header
from the max size, and max_size was thus larger than the correct value,
leading to potential OOB writes.

If the buffer cannot fit the header or can fit only the header, return
the buffer immediately.

Cc: qemu-stable@nongnu.org
Fixes: 98e77e3dd8dd6e7aa9a7dffa60f49c8c8a49d4e3 ("virtio-snd: add max size bounds check in input cb")
Reported-by: DARKNAVY <vr@darknavy.com>
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20260220-virtio-snd-series-v1-4-207c4f7200a2@linaro.org>

hw/audio/virtio-snd.c

index ae8bfbca431046dfa240f5e19559aab629147b65..d1a46d47bcab94f30c4c597f6c703767813548ad 100644 (file)
@@ -1265,6 +1265,12 @@ static void virtio_snd_pcm_in_cb(void *data, int available)
             }
 
             max_size = iov_size(buffer->elem->in_sg, buffer->elem->in_num);
+            if (max_size <= sizeof(virtio_snd_pcm_status)) {
+                return_rx_buffer(stream, buffer);
+                continue;
+            }
+            max_size -= sizeof(virtio_snd_pcm_status);
+
             for (;;) {
                 if (buffer->size >= max_size) {
                     return_rx_buffer(stream, buffer);