examples/vhost: fix use after free on drain
authorWenwu Ma <wenwux.ma@intel.com>
Fri, 24 Sep 2021 17:23:00 +0000 (17:23 +0000)
committerMaxime Coquelin <maxime.coquelin@redhat.com>
Thu, 21 Oct 2021 12:24:21 +0000 (14:24 +0200)
When a vdev is removed in destroy_device function,
the corresponding vhost TX buffer will also be freed,
but the vhost TX buffer may still be used in the
drain_vhost function, which will cause an error of
heap-use-after-free. Therefore, before accessing
vhost TX buffer, we need to check whether the vdev
has been removed, if so, let's skip this vdev.

Fixes: a68ba8e0a6b6 ("examples/vhost: refactor vhost data path")
Cc: stable@dpdk.org
Signed-off-by: Wenwu Ma <wenwux.ma@intel.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
examples/vhost/main.c

index 999809e..9721891 100644 (file)
@@ -914,6 +914,9 @@ drain_vhost_table(void)
        uint64_t cur_tsc;
 
        TAILQ_FOREACH(vdev, &vhost_dev_list, global_vdev_entry) {
+               if (unlikely(vdev->remove == 1))
+                       continue;
+
                vhost_txq = vhost_txbuff[lcore_id * MAX_VHOST_DEVICE
                                                + vdev->vid];