diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2015-02-13 01:43:42 -0500 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2015-02-13 01:45:50 -0500 |
commit | 3afe3e0f8db10a41a5923e1d7498318877473f33 (patch) | |
tree | 4da04fb2dde7e05c298e8a481c6cc5d6eb096c69 /tools | |
parent | c97eb679ef70dbb4482e66b9d192fc9e5bc6e0d6 (diff) |
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: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/lguest/lguest.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/tools/lguest/lguest.c b/tools/lguest/lguest.c index 80dc6346030e..990671e61f87 100644 --- a/tools/lguest/lguest.c +++ b/tools/lguest/lguest.c | |||
@@ -769,20 +769,21 @@ static unsigned wait_for_vq_desc(struct virtqueue *vq, | |||
769 | * that: no rmb() required. | 769 | * that: no rmb() required. |
770 | */ | 770 | */ |
771 | 771 | ||
772 | /* | 772 | do { |
773 | * If this is an indirect entry, then this buffer contains a descriptor | 773 | /* |
774 | * table which we handle as if it's any normal descriptor chain. | 774 | * If this is an indirect entry, then this buffer contains a |
775 | */ | 775 | * descriptor table which we handle as if it's any normal |
776 | if (desc[i].flags & VRING_DESC_F_INDIRECT) { | 776 | * descriptor chain. |
777 | if (desc[i].len % sizeof(struct vring_desc)) | 777 | */ |
778 | errx(1, "Invalid size for indirect buffer table"); | 778 | if (desc[i].flags & VRING_DESC_F_INDIRECT) { |
779 | if (desc[i].len % sizeof(struct vring_desc)) | ||
780 | errx(1, "Invalid size for indirect buffer table"); | ||
779 | 781 | ||
780 | max = desc[i].len / sizeof(struct vring_desc); | 782 | max = desc[i].len / sizeof(struct vring_desc); |
781 | desc = check_pointer(desc[i].addr, desc[i].len); | 783 | desc = check_pointer(desc[i].addr, desc[i].len); |
782 | i = 0; | 784 | i = 0; |
783 | } | 785 | } |
784 | 786 | ||
785 | do { | ||
786 | /* Grab the first descriptor, and check it's OK. */ | 787 | /* Grab the first descriptor, and check it's OK. */ |
787 | iov[*out_num + *in_num].iov_len = desc[i].len; | 788 | iov[*out_num + *in_num].iov_len = desc[i].len; |
788 | iov[*out_num + *in_num].iov_base | 789 | iov[*out_num + *in_num].iov_base |