diff mbox series

powerpc/powermac/feature: Fix refcount leak bug

Message ID 20220716065412.539153-1-windhl@126.com (mailing list archive)
State Accepted
Headers show
Series powerpc/powermac/feature: Fix refcount leak bug | expand

Checks

Context Check Description
snowpatch_ozlabs/github-powerpc_ppctests success Successfully ran 10 jobs.
snowpatch_ozlabs/github-powerpc_selftests success Successfully ran 10 jobs.
snowpatch_ozlabs/github-powerpc_sparse success Successfully ran 4 jobs.
snowpatch_ozlabs/github-powerpc_clang success Successfully ran 7 jobs.
snowpatch_ozlabs/github-powerpc_kernel_qemu success Successfully ran 23 jobs.

Commit Message

Liang He July 16, 2022, 6:54 a.m. UTC
In probe_one_macio(), we should call of_node_put() for the refernece
'node' escaped out of the for_each_node_by_name() which has increased
its refcount. While the 'node' will finally escaped into a global
reference, we should still call of_node_put() in fail path which will
stop global reference creation.

Fixes: 51d3082fe6e5 ("[PATCH] powerpc: Unify udbg (#2)")
Signed-off-by: Liang He <windhl@126.com>
---
 commit-51d3082fe6e5 first introduces the 'of_find_node_by_name' which
involved the refcounting bug.

 arch/powerpc/platforms/powermac/feature.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

Comments

Michael Ellerman Sept. 9, 2022, 12:07 p.m. UTC | #1
On Sat, 16 Jul 2022 14:54:12 +0800, Liang He wrote:
> In probe_one_macio(), we should call of_node_put() for the refernece
> 'node' escaped out of the for_each_node_by_name() which has increased
> its refcount. While the 'node' will finally escaped into a global
> reference, we should still call of_node_put() in fail path which will
> stop global reference creation.
> 
> 
> [...]

Applied to powerpc/next.

[1/1] powerpc/powermac/feature: Fix refcount leak bug
      https://git.kernel.org/powerpc/c/d36337ce950ce8c57a8e4f61593f923cceaf0dd7

cheers
diff mbox series

Patch

diff --git a/arch/powerpc/platforms/powermac/feature.c b/arch/powerpc/platforms/powermac/feature.c
index 5cc958adba13..0382d20b5619 100644
--- a/arch/powerpc/platforms/powermac/feature.c
+++ b/arch/powerpc/platforms/powermac/feature.c
@@ -2632,31 +2632,31 @@  static void __init probe_one_macio(const char *name, const char *compat, int typ
 		if (!macio_chips[i].of_node)
 			break;
 		if (macio_chips[i].of_node == node)
-			return;
+			goto out_put;
 	}
 
 	if (i >= MAX_MACIO_CHIPS) {
 		printk(KERN_ERR "pmac_feature: Please increase MAX_MACIO_CHIPS !\n");
 		printk(KERN_ERR "pmac_feature: %pOF skipped\n", node);
-		return;
+		goto out_put;
 	}
 	addrp = of_get_pci_address(node, 0, &size, NULL);
 	if (addrp == NULL) {
 		printk(KERN_ERR "pmac_feature: %pOF: can't find base !\n",
 		       node);
-		return;
+		goto out_put;
 	}
 	addr = of_translate_address(node, addrp);
 	if (addr == 0) {
 		printk(KERN_ERR "pmac_feature: %pOF, can't translate base !\n",
 		       node);
-		return;
+		goto out_put;
 	}
 	base = ioremap(addr, (unsigned long)size);
 	if (!base) {
 		printk(KERN_ERR "pmac_feature: %pOF, can't map mac-io chip !\n",
 		       node);
-		return;
+		goto out_put;
 	}
 	if (type == macio_keylargo || type == macio_keylargo2) {
 		const u32 *did = of_get_property(node, "device-id", NULL);
@@ -2677,6 +2677,11 @@  static void __init probe_one_macio(const char *name, const char *compat, int typ
 		macio_chips[i].rev = *revp;
 	printk(KERN_INFO "Found a %s mac-io controller, rev: %d, mapped at 0x%p\n",
 		macio_names[type], macio_chips[i].rev, macio_chips[i].base);
+
+	return;
+
+out_put:
+	of_node_put(node);
 }
 
 static int __init