| From 572524b4bdc2168d99cc7bab059dfaf3dcaca2d0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 14 Nov 2020 19:17:08 +0800 |
| Subject: can: ti_hecc: Fix memleak in ti_hecc_probe |
| |
| From: Zhang Qilong <zhangqilong3@huawei.com> |
| |
| [ Upstream commit 7968c7c79d3be8987feb8021f0c46e6866831408 ] |
| |
| In the error handling, we should goto the probe_exit_candev |
| to free ndev to prevent memory leak. |
| |
| Fixes: dabf54dd1c63 ("can: ti_hecc: Convert TI HECC driver to DT only driver") |
| Signed-off-by: Zhang Qilong <zhangqilong3@huawei.com> |
| Link: https://lore.kernel.org/r/20201114111708.3465543-1-zhangqilong3@huawei.com |
| Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/can/ti_hecc.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c |
| index db6ea936dc3fc..81a3fdd5e0103 100644 |
| --- a/drivers/net/can/ti_hecc.c |
| +++ b/drivers/net/can/ti_hecc.c |
| @@ -903,7 +903,8 @@ static int ti_hecc_probe(struct platform_device *pdev) |
| priv->base = devm_ioremap_resource(&pdev->dev, res); |
| if (IS_ERR(priv->base)) { |
| dev_err(&pdev->dev, "hecc ioremap failed\n"); |
| - return PTR_ERR(priv->base); |
| + err = PTR_ERR(priv->base); |
| + goto probe_exit_candev; |
| } |
| |
| /* handle hecc-ram memory */ |
| @@ -916,7 +917,8 @@ static int ti_hecc_probe(struct platform_device *pdev) |
| priv->hecc_ram = devm_ioremap_resource(&pdev->dev, res); |
| if (IS_ERR(priv->hecc_ram)) { |
| dev_err(&pdev->dev, "hecc-ram ioremap failed\n"); |
| - return PTR_ERR(priv->hecc_ram); |
| + err = PTR_ERR(priv->hecc_ram); |
| + goto probe_exit_candev; |
| } |
| |
| /* handle mbx memory */ |
| @@ -929,13 +931,14 @@ static int ti_hecc_probe(struct platform_device *pdev) |
| priv->mbx = devm_ioremap_resource(&pdev->dev, res); |
| if (IS_ERR(priv->mbx)) { |
| dev_err(&pdev->dev, "mbx ioremap failed\n"); |
| - return PTR_ERR(priv->mbx); |
| + err = PTR_ERR(priv->mbx); |
| + goto probe_exit_candev; |
| } |
| |
| irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| if (!irq) { |
| dev_err(&pdev->dev, "No irq resource\n"); |
| - goto probe_exit; |
| + goto probe_exit_candev; |
| } |
| |
| priv->ndev = ndev; |
| @@ -988,7 +991,7 @@ probe_exit_clk: |
| clk_put(priv->clk); |
| probe_exit_candev: |
| free_candev(ndev); |
| -probe_exit: |
| + |
| return err; |
| } |
| |
| -- |
| 2.27.0 |
| |