Skip to content

Commit

Permalink
media: platform: sti: c8sectpfe: core: Add of_node_put() at goto
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Patrice Chotard <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
gaurijhangiani authored and mchehab committed Nov 27, 2020
1 parent d0ac1a2 commit bf9d46f
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions drivers/media/platform/sti/c8sectpfe/c8sectpfe-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,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];
Expand All @@ -775,7 +775,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 */
Expand All @@ -784,7 +784,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,
Expand All @@ -800,22 +800,22 @@ 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);
if (!tsin->i2c_adapter) {
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);

Expand All @@ -826,15 +826,15 @@ 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,
GPIOF_OUT_INIT_LOW, "NIM reset");
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) {
Expand Down Expand Up @@ -877,6 +877,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;
Expand Down

0 comments on commit bf9d46f

Please sign in to comment.