提交 3afe3e0f 编写于 作者: R Rusty Russell

tools/lguest: handle indirect partway through chain.

Linux doesn't generate these, but it's perfectly valid according to
a close reading of the spec.  I opened virtio spec bug VIRTIO-134 to
make this clearer there, too.
Signed-off-by: NRusty Russell <rusty@rustcorp.com.au>
上级 c97eb679
...@@ -769,20 +769,21 @@ static unsigned wait_for_vq_desc(struct virtqueue *vq, ...@@ -769,20 +769,21 @@ static unsigned wait_for_vq_desc(struct virtqueue *vq,
* that: no rmb() required. * that: no rmb() required.
*/ */
/* do {
* If this is an indirect entry, then this buffer contains a descriptor /*
* table which we handle as if it's any normal descriptor chain. * If this is an indirect entry, then this buffer contains a
*/ * descriptor table which we handle as if it's any normal
if (desc[i].flags & VRING_DESC_F_INDIRECT) { * descriptor chain.
if (desc[i].len % sizeof(struct vring_desc)) */
errx(1, "Invalid size for indirect buffer table"); if (desc[i].flags & VRING_DESC_F_INDIRECT) {
if (desc[i].len % sizeof(struct vring_desc))
errx(1, "Invalid size for indirect buffer table");
max = desc[i].len / sizeof(struct vring_desc); max = desc[i].len / sizeof(struct vring_desc);
desc = check_pointer(desc[i].addr, desc[i].len); desc = check_pointer(desc[i].addr, desc[i].len);
i = 0; i = 0;
} }
do {
/* Grab the first descriptor, and check it's OK. */ /* Grab the first descriptor, and check it's OK. */
iov[*out_num + *in_num].iov_len = desc[i].len; iov[*out_num + *in_num].iov_len = desc[i].len;
iov[*out_num + *in_num].iov_base iov[*out_num + *in_num].iov_base
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册