From 0e78cfddc0851a0a12da0257758fe011ec507495 Mon Sep 17 00:00:00 2001 From: Huanle Han Date: Mon, 20 Feb 2017 22:04:46 +0800 Subject: [PATCH] net/virtio: fix crash when closing twice 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 Acked-by: Yuanhan Liu --- drivers/net/virtio/virtio_ethdev.c | 5 +++++ lib/librte_ether/rte_ethdev.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 73e5da8c54..b23f4c278c 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -546,6 +546,9 @@ virtio_free_queues(struct virtio_hw *hw) int queue_type; uint16_t i; + if (hw->vqs == NULL) + return; + 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); + hw->vqs[i] = NULL; } rte_free(hw->vqs); + hw->vqs = NULL; } static int diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 89f6514bcd..ef137c38a3 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -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->nb_rx_queues = 0; 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; } -- 2.20.1