mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-22 04:31:58 +08:00
vringh: Fix loop descriptors check in the indirect cases
[ Upstream commitdbd29e0752
] 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
a3f9b0afd8
commit
1a36f77dc2
@ -264,7 +264,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
|
||||
gfp_t gfp,
|
||||
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 vringh_range range = { -1ULL, 0 }, slowrange;
|
||||
bool slow = false;
|
||||
@ -321,7 +321,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;
|
||||
@ -383,6 +388,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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user