From: David Marchand <[email protected]>

The vhost library was not enforcing any limit on the number of queue a
guest could allocate, which could result in out of bound accesses in the
driver or other nasty bugs.

CVE-2026-86856
Bugzilla ID: 2027

Fixes: 10421b0d9075 ("vdpa/nfp: add interrupt logic of vring relay")
Cc: [email protected]

Acked-by: Kevin Traynor <[email protected]>
Signed-off-by: David Marchand <[email protected]>
---
 lib/vhost/vhost_user.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c
index 15f13ef443..6efe8fe860 100644
--- a/lib/vhost/vhost_user.c
+++ b/lib/vhost/vhost_user.c
@@ -3280,6 +3280,7 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net 
*dev,
                        struct vhu_msg_context *ctx)
 {
        uint32_t vring_idx;
+       uint32_t queue_num;
 
        switch (ctx->msg.request.frontend) {
        case VHOST_USER_SET_VRING_KICK:
@@ -3303,7 +3304,12 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net 
*dev,
                return 0;
        }
 
-       if (vring_idx >= VHOST_MAX_VRING) {
+       if (rte_vhost_driver_get_queue_num(dev->ifname, &queue_num) < 0) {
+               VHOST_CONFIG_LOG(dev->ifname, ERR, "failed to get queue num");
+               return -1;
+       }
+
+       if (vring_idx >= queue_num * 2) {
                VHOST_CONFIG_LOG(dev->ifname, ERR, "invalid vring index: %u", 
vring_idx);
                return -1;
        }
-- 
2.56.0

Reply via email to