[PATCH] sfc: Fix an error handling path in efx_pci_probe()

Christophe JAILLET posted 1 patch 3 years, 5 months ago
drivers/net/ethernet/sfc/efx.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
[PATCH] sfc: Fix an error handling path in efx_pci_probe()
Posted by Christophe JAILLET 3 years, 5 months ago
If an error occurs after the first kzalloc() the corresponding memory
allocation is never freed.

Add the missing kfree() in the error handling path, as already done in the
remove() function.

Fixes: 7e773594dada ("sfc: Separate efx_nic memory from net_device memory")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
When 7e773594dada was merged, sfc/ef100.c had the same issue.
But it seems to have been fixed in 98ff4c7c8ac7.
---
 drivers/net/ethernet/sfc/efx.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index 054d5ce6029e..0556542d7a6b 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -1059,8 +1059,10 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
 
 	/* Allocate and initialise a struct net_device */
 	net_dev = alloc_etherdev_mq(sizeof(probe_data), EFX_MAX_CORE_TX_QUEUES);
-	if (!net_dev)
-		return -ENOMEM;
+	if (!net_dev) {
+		rc = -ENOMEM;
+		goto fail0;
+	}
 	probe_ptr = netdev_priv(net_dev);
 	*probe_ptr = probe_data;
 	efx->net_dev = net_dev;
@@ -1132,6 +1134,8 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
 	WARN_ON(rc > 0);
 	netif_dbg(efx, drv, efx->net_dev, "initialisation failed. rc=%d\n", rc);
 	free_netdev(net_dev);
+ fail0:
+	kfree(probe_data);
 	return rc;
 }
 
-- 
2.34.1
Re: [PATCH] sfc: Fix an error handling path in efx_pci_probe()
Posted by patchwork-bot+netdevbpf@kernel.org 3 years, 5 months ago
Hello:

This patch was applied to netdev/net.git (master)
by Jakub Kicinski <kuba@kernel.org>:

On Sat, 29 Oct 2022 22:57:11 +0200 you wrote:
> If an error occurs after the first kzalloc() the corresponding memory
> allocation is never freed.
> 
> Add the missing kfree() in the error handling path, as already done in the
> remove() function.
> 
> Fixes: 7e773594dada ("sfc: Separate efx_nic memory from net_device memory")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> 
> [...]

Here is the summary with links:
  - sfc: Fix an error handling path in efx_pci_probe()
    https://git.kernel.org/netdev/net/c/6c412da54c80

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
Re: [PATCH] sfc: Fix an error handling path in efx_pci_probe()
Posted by Martin Habets 3 years, 5 months ago
Please specify a branch in the subject.
This patch should go to net.

On Sat, Oct 29, 2022 at 10:57:11PM +0200, Christophe JAILLET wrote:
> If an error occurs after the first kzalloc() the corresponding memory
> allocation is never freed.
> 
> Add the missing kfree() in the error handling path, as already done in the
> remove() function.
> 
> Fixes: 7e773594dada ("sfc: Separate efx_nic memory from net_device memory")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

Acked-by: Martin Habets <habetsm.xilinx@gmail.com>

> ---
> When 7e773594dada was merged, sfc/ef100.c had the same issue.
> But it seems to have been fixed in 98ff4c7c8ac7.

I agree.

> ---
>  drivers/net/ethernet/sfc/efx.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
> index 054d5ce6029e..0556542d7a6b 100644
> --- a/drivers/net/ethernet/sfc/efx.c
> +++ b/drivers/net/ethernet/sfc/efx.c
> @@ -1059,8 +1059,10 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
>  
>  	/* Allocate and initialise a struct net_device */
>  	net_dev = alloc_etherdev_mq(sizeof(probe_data), EFX_MAX_CORE_TX_QUEUES);
> -	if (!net_dev)
> -		return -ENOMEM;
> +	if (!net_dev) {
> +		rc = -ENOMEM;
> +		goto fail0;
> +	}
>  	probe_ptr = netdev_priv(net_dev);
>  	*probe_ptr = probe_data;
>  	efx->net_dev = net_dev;
> @@ -1132,6 +1134,8 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
>  	WARN_ON(rc > 0);
>  	netif_dbg(efx, drv, efx->net_dev, "initialisation failed. rc=%d\n", rc);
>  	free_netdev(net_dev);
> + fail0:
> +	kfree(probe_data);
>  	return rc;
>  }
>  
> -- 
> 2.34.1