When zero-copy usage of indirect descriptors buffer table isn't possible, library gather scattered memory chunks in a local copy. This commit fixes the issue with pointer arithmetic for the local copy buffer.
Signed-off-by: Temir Zharaspayev <mass...@gmail.com> --- subprojects/libvduse/libvduse.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/subprojects/libvduse/libvduse.c b/subprojects/libvduse/libvduse.c index 21ffbb5b8d..0b445fbc76 100644 --- a/subprojects/libvduse/libvduse.c +++ b/subprojects/libvduse/libvduse.c @@ -465,7 +465,7 @@ static int vduse_queue_read_indirect_desc(VduseDev *dev, struct vring_desc *desc, uint64_t addr, size_t len) { - struct vring_desc *ori_desc; + uint8_t *src_cursor, *dst_cursor; uint64_t read_len; if (len > (VIRTQUEUE_MAX_SIZE * sizeof(struct vring_desc))) { @@ -476,17 +476,18 @@ vduse_queue_read_indirect_desc(VduseDev *dev, struct vring_desc *desc, return -1; } + dst_cursor = (uint8_t *) desc; while (len) { read_len = len; - ori_desc = iova_to_va(dev, &read_len, addr); - if (!ori_desc) { + src_cursor = iova_to_va(dev, &read_len, addr); + if (!src_cursor) { return -1; } - memcpy(desc, ori_desc, read_len); + memcpy(dst_cursor, src_cursor, read_len); len -= read_len; addr += read_len; - desc += read_len; + dst_cursor += read_len; } return 0; -- 2.34.1