e4dd39c699
In vhost_svq_poll(), if vhost_svq_get_buf() fails due to a device
providing invalid descriptors, len is left uninitialized and returned
to the caller, potentally leaking stack data or causing undefined
behavior.
Fix this by initializing len to 0.
Found with GCC 13 and -fanalyzer (abridged):
../hw/virtio/vhost-shadow-virtqueue.c: In function ‘vhost_svq_poll’:
../hw/virtio/vhost-shadow-virtqueue.c:538:12: warning: use of uninitialized value ‘len’ [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
538 | return len;
| ^~~
‘vhost_svq_poll’: events 1-4
|
| 522 | size_t vhost_svq_poll(VhostShadowVirtqueue *svq)
| | ^~~~~~~~~~~~~~
| | |
| | (1) entry to ‘vhost_svq_poll’
|......
| 525 | uint32_t len;
| | ~~~
| | |
| | (2) region created on stack here
| | (3) capacity: 4 bytes
|......
| 528 | if (vhost_svq_more_used(svq)) {
| | ~
| | |
| | (4) inlined call to ‘vhost_svq_more_used’ from ‘vhost_svq_poll’
(...)
| 528 | if (vhost_svq_more_used(svq)) {
| | ^~~~~~~~~~~~~~~~~~~~~~~~~
| | ||
| | |(8) ...to here
| | (7) following ‘true’ branch...
|......
| 537 | vhost_svq_get_buf(svq, &len);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (9) calling ‘vhost_svq_get_buf’ from ‘vhost_svq_poll’
|
+--> ‘vhost_svq_get_buf’: events 10-11
|
| 416 | static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
| | ^~~~~~~~~~~~~~~~~
| | |
| | (10) entry to ‘vhost_svq_get_buf’
|......
| 423 | if (!vhost_svq_more_used(svq)) {
| | ~
| | |
| | (11) inlined call to ‘vhost_svq_more_used’ from ‘vhost_svq_get_buf’
|
(...)
|
‘vhost_svq_get_buf’: event 14
|
| 423 | if (!vhost_svq_more_used(svq)) {
| | ^
| | |
| | (14) following ‘false’ branch...
|
‘vhost_svq_get_buf’: event 15
|
|cc1:
| (15): ...to here
|
<------+
|
‘vhost_svq_poll’: events 16-17
|
| 537 | vhost_svq_get_buf(svq, &len);
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (16) returning to ‘vhost_svq_poll’ from ‘vhost_svq_get_buf’
| 538 | return len;
| | ~~~
| | |
| | (17) use of uninitialized value ‘len’ here
Note by Laurent Vivier <lvivier@redhat.com>:
The return value is only used to detect an error:
vhost_svq_poll
vhost_vdpa_net_cvq_add
vhost_vdpa_net_load_cmd
vhost_vdpa_net_load_mac
-> a negative return is only used to detect error
vhost_vdpa_net_load_mq
-> a negative return is only used to detect error
vhost_vdpa_net_handle_ctrl_avail
-> a negative return is only used to detect error
Fixes:
|
||
---|---|---|
.. | ||
Kconfig | ||
meson.build | ||
trace-events | ||
trace.h | ||
vdpa-dev-pci.c | ||
vdpa-dev.c | ||
vhost-backend.c | ||
vhost-iova-tree.c | ||
vhost-iova-tree.h | ||
vhost-scsi-pci.c | ||
vhost-shadow-virtqueue.c | ||
vhost-shadow-virtqueue.h | ||
vhost-stub.c | ||
vhost-user-blk-pci.c | ||
vhost-user-fs-pci.c | ||
vhost-user-fs.c | ||
vhost-user-gpio-pci.c | ||
vhost-user-gpio.c | ||
vhost-user-i2c-pci.c | ||
vhost-user-i2c.c | ||
vhost-user-input-pci.c | ||
vhost-user-rng-pci.c | ||
vhost-user-rng.c | ||
vhost-user-scsi-pci.c | ||
vhost-user-vsock-pci.c | ||
vhost-user-vsock.c | ||
vhost-user.c | ||
vhost-vdpa.c | ||
vhost-vsock-common.c | ||
vhost-vsock-pci.c | ||
vhost-vsock.c | ||
vhost.c | ||
virtio-9p-pci.c | ||
virtio-balloon-pci.c | ||
virtio-balloon.c | ||
virtio-blk-pci.c | ||
virtio-bus.c | ||
virtio-config-io.c | ||
virtio-crypto-pci.c | ||
virtio-crypto.c | ||
virtio-hmp-cmds.c | ||
virtio-input-host-pci.c | ||
virtio-input-pci.c | ||
virtio-iommu-pci.c | ||
virtio-iommu.c | ||
virtio-mem-pci.c | ||
virtio-mem-pci.h | ||
virtio-mem.c | ||
virtio-mmio.c | ||
virtio-net-pci.c | ||
virtio-pci.c | ||
virtio-pmem-pci.c | ||
virtio-pmem-pci.h | ||
virtio-pmem.c | ||
virtio-qmp.c | ||
virtio-qmp.h | ||
virtio-rng-pci.c | ||
virtio-rng.c | ||
virtio-scsi-pci.c | ||
virtio-serial-pci.c | ||
virtio-stub.c | ||
virtio.c |