net/virtio: fix crash when closing twice
authorHuanle Han <hanxueluo@gmail.com>
Mon, 20 Feb 2017 14:04:46 +0000 (22:04 +0800)
committerYuanhan Liu <yuanhan.liu@linux.intel.com>
Fri, 28 Apr 2017 05:01:22 +0000 (07:01 +0200)
This commit fixs segment fault when rte_eth_dev_close() is called on
a virtio dev more than once.  Assigning zero after free to avoids
freed memory to be accessed again.

Fixes: 69c80d4ef89b ("net/virtio: allocate queue at init stage")
Cc: stable@dpdk.org
Signed-off-by: Huanle Han <hanxueluo@gmail.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
drivers/net/virtio/virtio_ethdev.c
lib/librte_ether/rte_ethdev.c

index 73e5da8..b23f4c2 100644 (file)
@@ -546,6 +546,9 @@ virtio_free_queues(struct virtio_hw *hw)
        int queue_type;
        uint16_t i;
 
        int queue_type;
        uint16_t i;
 
+       if (hw->vqs == NULL)
+               return;
+
        for (i = 0; i < nr_vq; i++) {
                vq = hw->vqs[i];
                if (!vq)
        for (i = 0; i < nr_vq; i++) {
                vq = hw->vqs[i];
                if (!vq)
@@ -564,9 +567,11 @@ virtio_free_queues(struct virtio_hw *hw)
                }
 
                rte_free(vq);
                }
 
                rte_free(vq);
+               hw->vqs[i] = NULL;
        }
 
        rte_free(hw->vqs);
        }
 
        rte_free(hw->vqs);
+       hw->vqs = NULL;
 }
 
 static int
 }
 
 static int
index 89f6514..ef137c3 100644 (file)
@@ -986,8 +986,10 @@ rte_eth_dev_close(uint8_t port_id)
        dev->data->dev_started = 0;
        (*dev->dev_ops->dev_close)(dev);
 
        dev->data->dev_started = 0;
        (*dev->dev_ops->dev_close)(dev);
 
+       dev->data->nb_rx_queues = 0;
        rte_free(dev->data->rx_queues);
        dev->data->rx_queues = NULL;
        rte_free(dev->data->rx_queues);
        dev->data->rx_queues = NULL;
+       dev->data->nb_tx_queues = 0;
        rte_free(dev->data->tx_queues);
        dev->data->tx_queues = NULL;
 }
        rte_free(dev->data->tx_queues);
        dev->data->tx_queues = NULL;
 }