Skip to content

Commit

Permalink
vringh: Fix loop descriptors check in the indirect cases
Browse files Browse the repository at this point in the history
[ Upstream commit dbd29e0 ]

We should use size of descriptor chain to test loop condition
in the indirect case. And another statistical count is also introduced
for indirect descriptors to avoid conflict with the statistical count
of direct descriptors.

Fixes: f87d0fb ("vringh: host-side implementation of virtio rings.")
Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
Signed-off-by: Fam Zheng <fam.zheng@bytedance.com>
Message-Id: <20220505100910.137-1-xieyongji@bytedance.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
YongjiXie authored and gregkh committed Jun 14, 2022
1 parent 362e3b3 commit b6ea268
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions drivers/vhost/vringh.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
int (*copy)(const struct vringh *vrh,
void *dst, const void *src, size_t len))
{
int err, count = 0, up_next, desc_max;
int err, count = 0, indirect_count = 0, up_next, desc_max;
struct vring_desc desc, *descs;
struct vringh_range range = { -1ULL, 0 }, slowrange;
bool slow = false;
Expand Down Expand Up @@ -331,7 +331,12 @@ __vringh_iov(struct vringh *vrh, u16 i,
continue;
}

if (count++ == vrh->vring.num) {
if (up_next == -1)
count++;
else
indirect_count++;

if (count > vrh->vring.num || indirect_count > desc_max) {
vringh_bad("Descriptor loop in %p", descs);
err = -ELOOP;
goto fail;
Expand Down Expand Up @@ -393,6 +398,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
i = return_from_indirect(vrh, &up_next,
&descs, &desc_max);
slow = false;
indirect_count = 0;
} else
break;
}
Expand Down

0 comments on commit b6ea268

Please sign in to comment.