Re: [PATCH] media: platform: sti: c8sectpfe: core: Add of_node_put() at goto

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
> ---
>  .../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@xxxxxx>

Thanks





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux