vringh: Fix loop descriptors check in the indirect cases
[ Upstream commit dbd29e0752286af74243cf891accf472b2f3edd8 ]
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: f87d0fbb57
("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>
This commit is contained in:
parent
727d7f62e7
commit
4511b50505
@ -263,7 +263,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
|
|||||||
gfp_t gfp,
|
gfp_t gfp,
|
||||||
int (*copy)(void *dst, const void *src, size_t len))
|
int (*copy)(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;
|
||||||
@ -320,7 +320,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;
|
||||||
@ -382,6 +387,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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user