linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] media: platform: sti: c8sectpfe: core: Add of_node_put() at goto
@ 2019-07-16  5:38 Nishka Dasgupta
  2019-07-16  7:27 ` Patrice CHOTARD
  0 siblings, 1 reply; 2+ messages in thread
From: Nishka Dasgupta @ 2019-07-16  5:38 UTC (permalink / raw)
  To: patrice.chotard, mchehab, linux-arm-kernel, linux-media; +Cc: Nishka Dasgupta

Each iteration of for_each_child_of_node puts the previous node, but in
the case of a goto from the middle of the loop, there is no put, thus
causing a memory leak. Hence add a new label that puts the last used
node, and edit the goto statements in the middle of the loop to first go
to the new label.
Issue found with Coccinelle.

Signed-off-by: Nishka Dasgupta <nishkadg.linux@gmail.com>
---
 .../platform/sti/c8sectpfe/c8sectpfe-core.c    | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c b/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
index 3c05b3dc49ec..85ab20492c2d 100644
--- a/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
+++ b/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
@@ -771,7 +771,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 
 		if (!fei->channel_data[index]) {
 			ret = -ENOMEM;
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 
 		tsin = fei->channel_data[index];
@@ -781,7 +781,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 		ret = of_property_read_u32(child, "tsin-num", &tsin->tsin_id);
 		if (ret) {
 			dev_err(&pdev->dev, "No tsin_num found\n");
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 
 		/* sanity check value */
@@ -790,7 +790,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 				"tsin-num %d specified greater than number\n\tof input block hw in SoC! (%d)",
 				tsin->tsin_id, fei->hw_stats.num_ib);
 			ret = -EINVAL;
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 
 		tsin->invert_ts_clk = of_property_read_bool(child,
@@ -806,14 +806,14 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 					&tsin->dvb_card);
 		if (ret) {
 			dev_err(&pdev->dev, "No dvb-card found\n");
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 
 		i2c_bus = of_parse_phandle(child, "i2c-bus", 0);
 		if (!i2c_bus) {
 			dev_err(&pdev->dev, "No i2c-bus found\n");
 			ret = -ENODEV;
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 		tsin->i2c_adapter =
 			of_find_i2c_adapter_by_node(i2c_bus);
@@ -821,7 +821,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 			dev_err(&pdev->dev, "No i2c adapter found\n");
 			of_node_put(i2c_bus);
 			ret = -ENODEV;
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 		of_node_put(i2c_bus);
 
@@ -832,7 +832,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 			dev_err(dev,
 				"reset gpio for tsin%d not valid (gpio=%d)\n",
 				tsin->tsin_id, tsin->rst_gpio);
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 
 		ret = devm_gpio_request_one(dev, tsin->rst_gpio,
@@ -840,7 +840,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 		if (ret && ret != -EBUSY) {
 			dev_err(dev, "Can't request tsin%d reset gpio\n"
 				, fei->channel_data[index]->tsin_id);
-			goto err_clk_disable;
+			goto err_node_put;
 		}
 
 		if (!ret) {
@@ -883,6 +883,8 @@ static int c8sectpfe_probe(struct platform_device *pdev)
 
 	return 0;
 
+err_node_put:
+	of_node_put(child);
 err_clk_disable:
 	clk_disable_unprepare(fei->c8sectpfeclk);
 	return ret;
-- 
2.19.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] media: platform: sti: c8sectpfe: core: Add of_node_put() at goto
  2019-07-16  5:38 [PATCH] media: platform: sti: c8sectpfe: core: Add of_node_put() at goto Nishka Dasgupta
@ 2019-07-16  7:27 ` Patrice CHOTARD
  0 siblings, 0 replies; 2+ messages in thread
From: Patrice CHOTARD @ 2019-07-16  7:27 UTC (permalink / raw)
  To: Nishka Dasgupta, mchehab, linux-arm-kernel, linux-media

Hi Nishka

On 7/16/19 7:38 AM, Nishka Dasgupta wrote:
> Each iteration of for_each_child_of_node puts the previous node, but in
> the case of a goto from the middle of the loop, there is no put, thus
> causing a memory leak. Hence add a new label that puts the last used
> node, and edit the goto statements in the middle of the loop to first go
> to the new label.
> Issue found with Coccinelle.
>
> Signed-off-by: Nishka Dasgupta <nishkadg.linux@gmail.com>
> ---
>  .../platform/sti/c8sectpfe/c8sectpfe-core.c    | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c b/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
> index 3c05b3dc49ec..85ab20492c2d 100644
> --- a/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
> +++ b/drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
> @@ -771,7 +771,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  
>  		if (!fei->channel_data[index]) {
>  			ret = -ENOMEM;
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  
>  		tsin = fei->channel_data[index];
> @@ -781,7 +781,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  		ret = of_property_read_u32(child, "tsin-num", &tsin->tsin_id);
>  		if (ret) {
>  			dev_err(&pdev->dev, "No tsin_num found\n");
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  
>  		/* sanity check value */
> @@ -790,7 +790,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  				"tsin-num %d specified greater than number\n\tof input block hw in SoC! (%d)",
>  				tsin->tsin_id, fei->hw_stats.num_ib);
>  			ret = -EINVAL;
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  
>  		tsin->invert_ts_clk = of_property_read_bool(child,
> @@ -806,14 +806,14 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  					&tsin->dvb_card);
>  		if (ret) {
>  			dev_err(&pdev->dev, "No dvb-card found\n");
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  
>  		i2c_bus = of_parse_phandle(child, "i2c-bus", 0);
>  		if (!i2c_bus) {
>  			dev_err(&pdev->dev, "No i2c-bus found\n");
>  			ret = -ENODEV;
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  		tsin->i2c_adapter =
>  			of_find_i2c_adapter_by_node(i2c_bus);
> @@ -821,7 +821,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  			dev_err(&pdev->dev, "No i2c adapter found\n");
>  			of_node_put(i2c_bus);
>  			ret = -ENODEV;
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  		of_node_put(i2c_bus);
>  
> @@ -832,7 +832,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  			dev_err(dev,
>  				"reset gpio for tsin%d not valid (gpio=%d)\n",
>  				tsin->tsin_id, tsin->rst_gpio);
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  
>  		ret = devm_gpio_request_one(dev, tsin->rst_gpio,
> @@ -840,7 +840,7 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  		if (ret && ret != -EBUSY) {
>  			dev_err(dev, "Can't request tsin%d reset gpio\n"
>  				, fei->channel_data[index]->tsin_id);
> -			goto err_clk_disable;
> +			goto err_node_put;
>  		}
>  
>  		if (!ret) {
> @@ -883,6 +883,8 @@ static int c8sectpfe_probe(struct platform_device *pdev)
>  
>  	return 0;
>  
> +err_node_put:
> +	of_node_put(child);
>  err_clk_disable:
>  	clk_disable_unprepare(fei->c8sectpfeclk);
>  	return ret;

Acked-by: Patrice Chotard <patrice.chotard@st.com>

Thanks


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-07-16  7:27 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-16  5:38 [PATCH] media: platform: sti: c8sectpfe: core: Add of_node_put() at goto Nishka Dasgupta
2019-07-16  7:27 ` Patrice CHOTARD

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).