vhost: fix buffer length calculation
authorTiwei Bie <tiwei.bie@intel.com>
Tue, 17 Jul 2018 13:10:35 +0000 (21:10 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 23 Jul 2018 21:55:26 +0000 (23:55 +0200)
Fixes: fd68b4739d2c ("vhost: use buffer vectors in dequeue path")

Reported-by: Yinan Wang <yinan.wang@intel.com>
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
Acked-by: Zhihong Wang <zhihong.wang@intel.com>
Tested-by: Yinan Wang <yinan.wang@intel.com>
lib/librte_vhost/virtio_net.c

index 2b7ffcf..07cc0c8 100644 (file)
@@ -720,7 +720,8 @@ copy_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq,
                                uint16_t hdr_vec_idx = 0;
 
                                while (remain) {
-                                       len = remain;
+                                       len = RTE_MIN(remain,
+                                               buf_vec[hdr_vec_idx].buf_len);
                                        dst = buf_vec[hdr_vec_idx].buf_addr;
                                        rte_memcpy((void *)(uintptr_t)dst,
                                                        (void *)(uintptr_t)src,
@@ -747,7 +748,7 @@ copy_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq,
                        hdr_addr = 0;
                }
 
-               cpy_len = RTE_MIN(buf_len, mbuf_avail);
+               cpy_len = RTE_MIN(buf_avail, mbuf_avail);
 
                if (likely(cpy_len > MAX_BATCH_LEN ||
                                        vq->batch_copy_nb_elems >= vq->size)) {
@@ -1112,7 +1113,8 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq,
                         * in a contiguous virtual area.
                         */
                        while (remain) {
-                               len = remain;
+                               len = RTE_MIN(remain,
+                                       buf_vec[hdr_vec_idx].buf_len);
                                src = buf_vec[hdr_vec_idx].buf_addr;
                                rte_memcpy((void *)(uintptr_t)dst,
                                                   (void *)(uintptr_t)src, len);