The guest could trigger this buffer overflow by creating a cycle of descriptors
(which would also cause an infinite loop). The more common case is that
vq->avail->idx jumps out of the range [last_used_idx, last_used_idx+256). This
happens nearly every time when restarting a DPDK app inside a VM connected to a
vhost-user vswitch because the virtqueue memory allocated by the previous run
is zeroed.

Signed-off-by: Rich Lane <rlane at bigswitch.com>
---
 lib/librte_vhost/vhost_rxtx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_vhost/vhost_rxtx.c b/lib/librte_vhost/vhost_rxtx.c
index 9322ce6..d95b478 100644
--- a/lib/librte_vhost/vhost_rxtx.c
+++ b/lib/librte_vhost/vhost_rxtx.c
@@ -453,7 +453,7 @@ update_secure_len(struct vhost_virtqueue *vq, uint32_t id,
                vq->buf_vec[vec_id].desc_idx = idx;
                vec_id++;

-               if (vq->desc[idx].flags & VRING_DESC_F_NEXT) {
+               if (vq->desc[idx].flags & VRING_DESC_F_NEXT && vec_id < 
BUF_VECTOR_MAX) {
                        idx = vq->desc[idx].next;
                        next_desc = 1;
                }
-- 
1.9.1

Reply via email to