From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id ACBEFA052E for ; Mon, 9 Mar 2020 05:10:10 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6AB0B3B5; Mon, 9 Mar 2020 05:10:10 +0100 (CET) Received: from valinux.co.jp (vagw.valinux.co.jp [210.128.90.14]) by dpdk.org (Postfix) with ESMTP id 06C5E3B5 for ; Mon, 9 Mar 2020 05:10:08 +0100 (CET) Received: by valinux.co.jp (Postfix, from userid 1000) id B1DAF240A6C; Mon, 9 Mar 2020 13:10:07 +0900 (JST) From: Itsuro Oda To: stable@dpdk.org Date: Mon, 9 Mar 2020 13:10:07 +0900 Message-Id: <20200309041007.14289-2-oda@valinux.co.jp> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200309041007.14289-1-oda@valinux.co.jp> References: <20200309041007.14289-1-oda@valinux.co.jp> Subject: [dpdk-stable] [PATCH 18.11] net/vhost: fix setup error path X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" [ upstream commit 3e00307549ef7c90a9752f58f1d423542399267c ] If for some reason vhost_driver_setup() fails, the list element for the device may be freed without being removed from the internal list of devices. This patch fixes all the error paths, by unregistering the device from Vhost library it has been registered, remove the device from the list, reset device vring_state pointer from the global table and only free vring state if it had been allocated. Fixes: 3d01b759d267 ("net/vhost: delay driver setup") Cc: stable@dpdk.org Signed-off-by: Maxime Coquelin Reviewed-by: David Marchand Reviewed-by: Tiwei Bie --- drivers/net/vhost/rte_eth_vhost.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 87fae4e47..5e58ae572 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -874,12 +874,12 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev) list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); if (list == NULL) - goto error; + return -1; vring_state = rte_zmalloc_socket(name, sizeof(*vring_state), 0, numa_node); if (vring_state == NULL) - goto error; + goto free_list; list->eth_dev = eth_dev; pthread_mutex_lock(&internal_list_lock); @@ -890,24 +890,31 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev) vring_states[eth_dev->data->port_id] = vring_state; if (rte_vhost_driver_register(internal->iface_name, internal->flags)) - goto error; + goto list_remove; if (rte_vhost_driver_callback_register(internal->iface_name, &vhost_ops) < 0) { VHOST_LOG(ERR, "Can't register callbacks\n"); - goto error; + goto drv_unreg; } if (rte_vhost_driver_start(internal->iface_name) < 0) { VHOST_LOG(ERR, "Failed to start driver for %s\n", internal->iface_name); - goto error; + goto drv_unreg; } return 0; -error: +drv_unreg: + rte_vhost_driver_unregister(internal->iface_name); +list_remove: + vring_states[eth_dev->data->port_id] = NULL; + pthread_mutex_lock(&internal_list_lock); + TAILQ_REMOVE(&internal_list, list, next); + pthread_mutex_unlock(&internal_list_lock); rte_free(vring_state); +free_list: rte_free(list); return -1; -- 2.17.0