Skip to contentSkip to conversation

regulator: core: Add of_node_put() before return

PATCH In review Nishka Dasgupta 2 participants 6 messages Aug 8, 2019 – Aug 15, 2019 Voltage and current regulator framework

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 regulator: core: Add of_node_put() before return

In function of_get_child_regulator(), the loop for_each_child_of_node() contains two mid-loop return statements. Ordinarily the loop gets the node child at the beginning of every iteration and automatically puts child after the main body has been executed. However in the case of a mid-loop return child is not put, which may cause a memory leak. Hence create a new label, err_node_put, that puts child and then returns the required value; edit the mid-loop return statements to instead go to this new label.
Issue found with Coccinelle.

---
Changes in v2:
- Create a new label to put the node and return regnode.

 drivers/regulator/core.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/regulator/core.c +6 -2
index e0c0cf462004..4a27a46ec6e7 100644
@@ -381,12 +381,16 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 		if (!regnode) {
 			regnode = of_get_child_regulator(child, prop_name);
 			if (regnode)
-				return regnode;
+				goto err_node_put;
 		} else {
-			return regnode;
+			goto err_node_put;
 		}
 	}
 	return NULL;
+
+err_node_put:
+	of_node_put(child);
+	return regnode;
 }
 
 /**
Signature · 1 line
2.19.1
maintainer
#1 lore raw
Quoted 3 lines · Nishka Dasgupta

In function of_get_child_regulator(), the loop for_each_child_of_node() contains two mid-loop return statements. Ordinarily the loop gets the node child at the beginning of every iteration and automatically puts

Please do not submit new versions of already applied patches, please submit incremental updates to the existing code. Modifying existing commits creates problems for other users building on top of those commits so it's best practice to only change pubished git commits if absolutely essential.

#2 lore raw
Quoted 11 lines · Mark Brown
Quoted 3 lines · Nishka Dasgupta

In function of_get_child_regulator(), the loop for_each_child_of_node() contains two mid-loop return statements. Ordinarily the loop gets the node child at the beginning of every iteration and automatically puts

Please do not submit new versions of already applied patches, please submit incremental updates to the existing code. Modifying existing commits creates problems for other users building on top of those commits so it's best practice to only change pubished git commits if absolutely essential.

I am very sorry about this; I wasn't sure whether this particular commit had been applied. Should I split the commit and resend only the change to the old commit, or should I leave it as it is?

Thanking you,
Nishka

maintainer
#3 lore raw
Quoted 11 lines · Nishka Dasgupta
Quoted 5 lines · Mark Brown

Please do not submit new versions of already applied patches, please submit incremental updates to the existing code. Modifying existing commits creates problems for other users building on top of those commits so it's best practice to only change pubished git commits if absolutely essential.

I am very sorry about this; I wasn't sure whether this particular commit had been applied. Should I split the commit and resend only the change to the old commit, or should I leave it as it is?

If there's any changes you think are a good idea please send a new patch for them.

#4 lore raw

PATCH v2 1/1 regulator: core: Add label to collate of_node_put() statements

In function of_get_child_regulator(), the loop for_each_child_of_node() contains two mid-loop return statements, each preceded by a statement putting child. In order to reduce this repetition, create a new label, err_node_put, that puts child and then returns the required value; edit the mid-loop return blocks to instead go to this new label.

---
Changes in v2:
- Submit this as a separate patch instead of updating a previous patch.

 drivers/regulator/core.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/regulator/core.c +7 -6
index 7a5d52948703..4a27a46ec6e7 100644
@@ -380,16 +380,17 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 
 		if (!regnode) {
 			regnode = of_get_child_regulator(child, prop_name);
-			if (regnode) {
-				of_node_put(child);
-				return regnode;
-			}
+			if (regnode)
+				goto err_node_put;
 		} else {
-			of_node_put(child);
-			return regnode;
+			goto err_node_put;
 		}
 	}
 	return NULL;
+
+err_node_put:
+	of_node_put(child);
+	return regnode;
 }
 
 /**
Signature · 1 line
2.19.1
maintainer
#5 lore raw

Applied "regulator: core: Add label to collate of_node_put() statements" to the regulator tree

The patch

regulator: core: Add label to collate of_node_put() statements

has been applied to the regulator tree at

https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-5.4

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

From 81eeb0a35c2e40bcaf122c6aae3be4f7d9abe201 Mon Sep 17 00:00:00 2001
From: Nishka Dasgupta <[email protected]>
Date: Thu, 15 Aug 2019 11:07:04 +0530
Subject: [PATCH] regulator: core: Add label to collate of_node_put()
statements

In function of_get_child_regulator(), the loop for_each_child_of_node() contains two mid-loop return statements, each preceded by a statement putting child. In order to reduce this repetition, create a new label, err_node_put, that puts child and then returns the required value; edit the mid-loop return blocks to instead go to this new label.

---
 drivers/regulator/core.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/regulator/core.c +7 -6
index 7a5d52948703..4a27a46ec6e7 100644
@@ -380,16 +380,17 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 
 		if (!regnode) {
 			regnode = of_get_child_regulator(child, prop_name);
-			if (regnode) {
-				of_node_put(child);
-				return regnode;
-			}
+			if (regnode)
+				goto err_node_put;
 		} else {
-			of_node_put(child);
-			return regnode;
+			goto err_node_put;
 		}
 	}
 	return NULL;
+
+err_node_put:
+	of_node_put(child);
+	return regnode;
 }
 
 /**
Signature · 1 line
2.20.1