[dpdk-dev,v2,1/1] bonding: fix error handling in rte_eth_bond_create()

Message ID 1438778204-8896-1-git-send-email-bernard.iremonger@intel.com (mailing list archive)
State Superseded, archived
Headers

Commit Message

Iremonger, Bernard Aug. 5, 2015, 12:36 p.m. UTC
  if the name parameter to rte_eth_bond_create() was NULL,
there was a segmentation fault because eth_dev was also NULL.

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 drivers/net/bonding/rte_eth_bond_api.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
  

Comments

Marvin Liu Aug. 5, 2015, 12:48 p.m. UTC | #1
Tested-by: Marvin Liu <yong.liu@intel.com>

> -----Original Message-----
> From: Iremonger, Bernard
> Sent: Wednesday, August 05, 2015 8:37 PM
> To: dev@dpdk.org
> Cc: Jastrzebski, MichalX K; Liu, Yong; Iremonger, Bernard
> Subject: [PATCH v2 1/1] bonding: fix error handling in
> rte_eth_bond_create()
> 
> if the name parameter to rte_eth_bond_create() was NULL,
> there was a segmentation fault because eth_dev was also NULL.
> 
> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
> ---
>  drivers/net/bonding/rte_eth_bond_api.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/bonding/rte_eth_bond_api.c
> b/drivers/net/bonding/rte_eth_bond_api.c
> index 4ca26dd..0681d1a 100644
> --- a/drivers/net/bonding/rte_eth_bond_api.c
> +++ b/drivers/net/bonding/rte_eth_bond_api.c
> @@ -239,6 +239,10 @@ rte_eth_bond_create(const char *name, uint8_t mode,
> uint8_t socket_id)
> 
>  	eth_dev->data->mac_addrs = rte_zmalloc_socket(name, ETHER_ADDR_LEN,
> 0,
>  			socket_id);
> +	if (eth_dev->data->mac_addrs == NULL) {
> +		RTE_BOND_LOG(ERR, "Unable to malloc mac_addrs");
> +		goto err;
> +	}
> 
>  	eth_dev->data->dev_started = 0;
>  	eth_dev->data->promiscuous = 0;
> @@ -285,8 +289,10 @@ rte_eth_bond_create(const char *name, uint8_t mode,
> uint8_t socket_id)
>  err:
>  	rte_free(pci_dev);
>  	rte_free(internals);
> -	rte_free(eth_dev->data->mac_addrs);
> -
> +	if (eth_dev != NULL) {
> +		rte_free(eth_dev->data->mac_addrs);
> +		rte_eth_dev_release_port(eth_dev);
> +	}
>  	return -1;
>  }
> 
> --
> 1.9.1
  
Thomas Monjalon Aug. 5, 2015, 1:15 p.m. UTC | #2
2015-08-05 13:36, Bernard Iremonger:
> if the name parameter to rte_eth_bond_create() was NULL,
> there was a segmentation fault because eth_dev was also NULL.

You also add error handling of mac_addrs alloc and release_port().
It deserves to be said in this commit message.
  
Iremonger, Bernard Aug. 5, 2015, 1:19 p.m. UTC | #3
Hi Thomas,

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, August 5, 2015 2:16 PM
> To: Iremonger, Bernard
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2 1/1] bonding: fix error handling in
> rte_eth_bond_create()
> 
> 2015-08-05 13:36, Bernard Iremonger:
> > if the name parameter to rte_eth_bond_create() was NULL, there was a
> > segmentation fault because eth_dev was also NULL.
> 
> You also add error handling of mac_addrs alloc and release_port().
> It deserves to be said in this commit message.

Will I send a v3 patch ?

Regards,

Bernard.
  
Thomas Monjalon Aug. 5, 2015, 1:35 p.m. UTC | #4
2015-08-05 13:19, Iremonger, Bernard:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2015-08-05 13:36, Bernard Iremonger:
> > > if the name parameter to rte_eth_bond_create() was NULL, there was a
> > > segmentation fault because eth_dev was also NULL.
> > 
> > You also add error handling of mac_addrs alloc and release_port().
> > It deserves to be said in this commit message.
> 
> Will I send a v3 patch ?

My comment was mostly to show which kind of information may be useful.
Sometimes I write it myself. You are welcome to write it in order I add it
or you can send a v3.

Other note: the function names are avoided in commit titles as they are
redundant with the title prefix and not so easy to read.
The title could be
	bonding: fix crash on initialization error
or, to include other fixes,
	bonding: fix device initialization error handling

Thanks
  
Iremonger, Bernard Aug. 5, 2015, 1:39 p.m. UTC | #5
Hi Thomas,

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, August 5, 2015 2:35 PM
> To: Iremonger, Bernard
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2 1/1] bonding: fix error handling in
> rte_eth_bond_create()
> 
> 2015-08-05 13:19, Iremonger, Bernard:
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > 2015-08-05 13:36, Bernard Iremonger:
> > > > if the name parameter to rte_eth_bond_create() was NULL, there was
> > > > a segmentation fault because eth_dev was also NULL.
> > >
> > > You also add error handling of mac_addrs alloc and release_port().
> > > It deserves to be said in this commit message.
> >
> > Will I send a v3 patch ?
> 
> My comment was mostly to show which kind of information may be useful.
> Sometimes I write it myself. You are welcome to write it in order I add it or
> you can send a v3.
> 
> Other note: the function names are avoided in commit titles as they are
> redundant with the title prefix and not so easy to read.
> The title could be
> 	bonding: fix crash on initialization error or, to include other fixes,
> 	bonding: fix device initialization error handling
> 
> Thanks

I will send a v3.

Regards,

Bernard.
  

Patch

diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index 4ca26dd..0681d1a 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -239,6 +239,10 @@  rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 
 	eth_dev->data->mac_addrs = rte_zmalloc_socket(name, ETHER_ADDR_LEN, 0,
 			socket_id);
+	if (eth_dev->data->mac_addrs == NULL) {
+		RTE_BOND_LOG(ERR, "Unable to malloc mac_addrs");
+		goto err;
+	}
 
 	eth_dev->data->dev_started = 0;
 	eth_dev->data->promiscuous = 0;
@@ -285,8 +289,10 @@  rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 err:
 	rte_free(pci_dev);
 	rte_free(internals);
-	rte_free(eth_dev->data->mac_addrs);
-
+	if (eth_dev != NULL) {
+		rte_free(eth_dev->data->mac_addrs);
+		rte_eth_dev_release_port(eth_dev);
+	}
 	return -1;
 }