diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2024-02-06 14:06:08 -0500 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2024-02-07 14:44:13 +0100 |
commit | f2eea93c6b410efccc18f4b47090b4a4e842afbd (patch) | |
tree | 67c06d6dfcc23fff60fca3471d6bb2b53f230824 /hw/block | |
parent | 5fbcbd50fca67ffe35317f2e86f6822aa22e41c6 (diff) | |
download | qemu-f2eea93c6b410efccc18f4b47090b4a4e842afbd.zip qemu-f2eea93c6b410efccc18f4b47090b4a4e842afbd.tar.gz qemu-f2eea93c6b410efccc18f4b47090b4a4e842afbd.tar.bz2 |
virtio-blk: add vq_rq[] bounds check in virtio_blk_dma_restart_cb()
Hanna Czenczek <hreitz@redhat.com> noted that the array index in
virtio_blk_dma_restart_cb() is not bounds-checked:
g_autofree VirtIOBlockReq **vq_rq = g_new0(VirtIOBlockReq *, num_queues);
...
while (rq) {
VirtIOBlockReq *next = rq->next;
uint16_t idx = virtio_get_queue_index(rq->vq);
rq->next = vq_rq[idx];
^^^^^^^^^^
The code is correct because both rq->vq and vq_rq[] depend on
num_queues, but this is indirect and not 100% obvious. Add an assertion.
Suggested-by: Hanna Czenczek <hreitz@redhat.com>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-ID: <20240206190610.107963-4-stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'hw/block')
-rw-r--r-- | hw/block/virtio-blk.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index e430ba5..3121250 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -1209,6 +1209,8 @@ static void virtio_blk_dma_restart_cb(void *opaque, bool running, VirtIOBlockReq *next = rq->next; uint16_t idx = virtio_get_queue_index(rq->vq); + /* Only num_queues vqs were created so vq_rq[idx] is within bounds */ + assert(idx < num_queues); rq->next = vq_rq[idx]; vq_rq[idx] = rq; rq = next; |