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.li...@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.chot...@st.com>

Thanks

Reply via email to