[dpdk-dev] bond: fix for kvlist memory leak on rte_kvargs_process failure identified by klockwork scan

Message ID 1423823246-32211-1-git-send-email-declan.doherty@intel.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Doherty, Declan Feb. 13, 2015, 10:27 a.m. UTC
  Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
 lib/librte_pmd_bond/rte_eth_bond_pmd.c | 49 ++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 23 deletions(-)
  

Comments

Olivier Matz Feb. 13, 2015, 10:37 a.m. UTC | #1
Hi,

On 02/13/2015 11:27 AM, Declan Doherty wrote:
> Signed-off-by: Declan Doherty <declan.doherty@intel.com>
> ---
>  lib/librte_pmd_bond/rte_eth_bond_pmd.c | 49 ++++++++++++++++++----------------
>  1 file changed, 26 insertions(+), 23 deletions(-)
> 


Acked-by: Olivier Matz <olivier.matz@6wind.com>
  
De Lara Guarch, Pablo Feb. 13, 2015, 10:43 a.m. UTC | #2
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Declan Doherty
> Sent: Friday, February 13, 2015 10:27 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] bond: fix for kvlist memory leak on
> rte_kvargs_process failure identified by klockwork scan
> 
> Signed-off-by: Declan Doherty <declan.doherty@intel.com>

Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
  
Thomas Monjalon Feb. 18, 2015, 5:13 p.m. UTC | #3
> > Signed-off-by: Declan Doherty <declan.doherty@intel.com>
> 
> Acked-by: Olivier Matz <olivier.matz@6wind.com>

Applied, thanks
  

Patch

diff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
index 09b0f30..a75b163 100644
--- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c
+++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
@@ -1622,32 +1622,32 @@  bond_init(const char *name, const char *params)
 	/* Parse link bonding mode */
 	if (rte_kvargs_count(kvlist, PMD_BOND_MODE_KVARG) == 1) {
 		if (rte_kvargs_process(kvlist, PMD_BOND_MODE_KVARG,
-				&bond_ethdev_parse_slave_mode_kvarg, &bonding_mode) != 0) {
-			RTE_LOG(ERR, EAL, "Invalid mode for bonded device %s\n", name);
-			return -1;
+				&bond_ethdev_parse_slave_mode_kvarg,
+				&bonding_mode) != 0) {
+			RTE_LOG(ERR, EAL, "Invalid mode for bonded device %s\n",
+					name);
+			goto parse_error;
 		}
 	} else {
-		RTE_LOG(ERR, EAL,
-				"Mode must be specified only once for bonded device %s\n",
-				name);
-		return -1;
+		RTE_LOG(ERR, EAL, "Mode must be specified only once for bonded "
+				"device %s\n", name);
+		goto parse_error;
 	}
 
 	/* Parse socket id to create bonding device on */
 	arg_count = rte_kvargs_count(kvlist, PMD_BOND_SOCKET_ID_KVARG);
 	if (arg_count == 1) {
 		if (rte_kvargs_process(kvlist, PMD_BOND_SOCKET_ID_KVARG,
-				&bond_ethdev_parse_socket_id_kvarg, &socket_id) != 0) {
-			RTE_LOG(ERR, EAL,
-					"Invalid socket Id specified for bonded device %s\n",
-					name);
-			return -1;
+				&bond_ethdev_parse_socket_id_kvarg, &socket_id)
+				!= 0) {
+			RTE_LOG(ERR, EAL, "Invalid socket Id specified for "
+					"bonded device %s\n", name);
+			goto parse_error;
 		}
 	} else if (arg_count > 1) {
-		RTE_LOG(ERR, EAL,
-				"Socket Id can be specified only once for bonded device %s\n",
-				name);
-		return -1;
+		RTE_LOG(ERR, EAL, "Socket Id can be specified only once for "
+				"bonded device %s\n", name);
+		goto parse_error;
 	} else {
 		socket_id = rte_socket_id();
 	}
@@ -1655,18 +1655,21 @@  bond_init(const char *name, const char *params)
 	/* Create link bonding eth device */
 	port_id = rte_eth_bond_create(name, bonding_mode, socket_id);
 	if (port_id < 0) {
-		RTE_LOG(ERR, EAL,
-				"Failed to create socket %s in mode %u on socket %u.\n",
-				name, bonding_mode, socket_id);
-		return -1;
+		RTE_LOG(ERR, EAL, "Failed to create socket %s in mode %u on "
+				"socket %u.\n",	name, bonding_mode, socket_id);
+		goto parse_error;
 	}
 	internals = rte_eth_devices[port_id].data->dev_private;
 	internals->kvlist = kvlist;
 
-	RTE_LOG(INFO, EAL,
-			"Create bonded device %s on port %d in mode %u on socket %u.\n",
-			name, port_id, bonding_mode, socket_id);
+	RTE_LOG(INFO, EAL, "Create bonded device %s on port %d in mode %u on "
+			"socket %u.\n",	name, port_id, bonding_mode, socket_id);
 	return 0;
+
+parse_error:
+	rte_kvargs_free(kvlist);
+
+	return -1;
 }
 
 /* this part will resolve the slave portids after all the other pdev and vdev