Commit dbd29e07 authored by Xie Yongji's avatar Xie Yongji Committed by Michael S. Tsirkin

vringh: Fix loop descriptors check in the indirect cases

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: f87d0fbb ("vringh: host-side implementation of virtio rings.")
Signed-off-by: default avatarXie Yongji <xieyongji@bytedance.com>
Signed-off-by: default avatarFam Zheng <fam.zheng@bytedance.com>
Message-Id: <20220505100910.137-1-xieyongji@bytedance.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
parent f38b3c6a
...@@ -292,7 +292,7 @@ __vringh_iov(struct vringh *vrh, u16 i, ...@@ -292,7 +292,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
int (*copy)(const struct vringh *vrh, int (*copy)(const struct vringh *vrh,
void *dst, const void *src, size_t len)) 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 vring_desc desc, *descs;
struct vringh_range range = { -1ULL, 0 }, slowrange; struct vringh_range range = { -1ULL, 0 }, slowrange;
bool slow = false; bool slow = false;
...@@ -349,7 +349,12 @@ __vringh_iov(struct vringh *vrh, u16 i, ...@@ -349,7 +349,12 @@ __vringh_iov(struct vringh *vrh, u16 i,
continue; 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); vringh_bad("Descriptor loop in %p", descs);
err = -ELOOP; err = -ELOOP;
goto fail; goto fail;
...@@ -411,6 +416,7 @@ __vringh_iov(struct vringh *vrh, u16 i, ...@@ -411,6 +416,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
i = return_from_indirect(vrh, &up_next, i = return_from_indirect(vrh, &up_next,
&descs, &desc_max); &descs, &desc_max);
slow = false; slow = false;
indirect_count = 0;
} else } else
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment