drivers/regulator/max20086-regulator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
There is a missing call to of_node_put() if devm_kcalloc() fails.
Fix this by changing the code to use cleanup.h magic to drop the
refcount.
Fixes: 6b0cd72757c6 ("regulator: max20086: fix invalid memory access")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
---
drivers/regulator/max20086-regulator.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c
index b4fe76e33ff2..fcdd2d0317a5 100644
--- a/drivers/regulator/max20086-regulator.c
+++ b/drivers/regulator/max20086-regulator.c
@@ -5,6 +5,7 @@
// Copyright (C) 2022 Laurent Pinchart <laurent.pinchart@idesonboard.com>
// Copyright (C) 2018 Avnet, Inc.
+#include <linux/cleanup.h>
#include <linux/err.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
@@ -133,11 +134,11 @@ static int max20086_regulators_register(struct max20086 *chip)
static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on)
{
struct of_regulator_match *matches;
- struct device_node *node;
unsigned int i;
int ret;
- node = of_get_child_by_name(chip->dev->of_node, "regulators");
+ struct device_node *node __free(device_node) =
+ of_get_child_by_name(chip->dev->of_node, "regulators");
if (!node) {
dev_err(chip->dev, "regulators node not found\n");
return -ENODEV;
@@ -153,7 +154,6 @@ static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on)
ret = of_regulator_match(chip->dev, node, matches,
chip->info->num_outputs);
- of_node_put(node);
if (ret < 0) {
dev_err(chip->dev, "Failed to match regulators\n");
return -EINVAL;
--
2.47.2
On Tue, 27 May 2025 08:44:14 +0300, Dan Carpenter wrote:
> There is a missing call to of_node_put() if devm_kcalloc() fails.
> Fix this by changing the code to use cleanup.h magic to drop the
> refcount.
>
>
Applied to
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next
Thanks!
[1/1] regulator: max20086: Fix refcount leak in max20086_parse_regulators_dt()
commit: 06118ae36855b7d3d22688298e74a766ccf0cb7a
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
Hi Dan,
Thank you for the patch.
On Tue, May 27, 2025 at 08:44:14AM +0300, Dan Carpenter wrote:
> There is a missing call to of_node_put() if devm_kcalloc() fails.
> Fix this by changing the code to use cleanup.h magic to drop the
> refcount.
>
> Fixes: 6b0cd72757c6 ("regulator: max20086: fix invalid memory access")
> Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/regulator/max20086-regulator.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c
> index b4fe76e33ff2..fcdd2d0317a5 100644
> --- a/drivers/regulator/max20086-regulator.c
> +++ b/drivers/regulator/max20086-regulator.c
> @@ -5,6 +5,7 @@
> // Copyright (C) 2022 Laurent Pinchart <laurent.pinchart@idesonboard.com>
> // Copyright (C) 2018 Avnet, Inc.
>
> +#include <linux/cleanup.h>
> #include <linux/err.h>
> #include <linux/gpio/consumer.h>
> #include <linux/i2c.h>
> @@ -133,11 +134,11 @@ static int max20086_regulators_register(struct max20086 *chip)
> static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on)
> {
> struct of_regulator_match *matches;
> - struct device_node *node;
> unsigned int i;
> int ret;
>
> - node = of_get_child_by_name(chip->dev->of_node, "regulators");
> + struct device_node *node __free(device_node) =
> + of_get_child_by_name(chip->dev->of_node, "regulators");
> if (!node) {
> dev_err(chip->dev, "regulators node not found\n");
> return -ENODEV;
> @@ -153,7 +154,6 @@ static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on)
>
> ret = of_regulator_match(chip->dev, node, matches,
> chip->info->num_outputs);
> - of_node_put(node);
> if (ret < 0) {
> dev_err(chip->dev, "Failed to match regulators\n");
> return -EINVAL;
--
Regards,
Laurent Pinchart
© 2016 - 2025 Red Hat, Inc.