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