From mboxrd@z Thu Jan 1 00:00:00 1970 From: hanxueluo@126.com Subject: [PATCH 2/3] net/virtio: fix crash when close virtio dev twice Date: Mon, 20 Feb 2017 22:04:46 +0800 Message-ID: <1487599487-12574-2-git-send-email-hanxueluo@126.com> References: <1487599487-12574-1-git-send-email-hanxueluo@126.com> Cc: Huanle Han To: dev@dpdk.org Return-path: Received: from m15-112.126.com (m15-112.126.com [220.181.15.112]) by dpdk.org (Postfix) with ESMTP id EDC6C58F6 for ; Mon, 20 Feb 2017 15:08:03 +0100 (CET) In-Reply-To: <1487599487-12574-1-git-send-email-hanxueluo@126.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Huanle Han 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. Signed-off-by: Huanle Han --- 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 8465e1a..b9565db 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -545,6 +545,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) @@ -563,9 +566,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 eb0a94a..24f82dc 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1074,8 +1074,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.7.4