[PATCH] clk: at91: fix device node reference leak in at91sam9x5_sckc_register()

From: Haotian Zhang

Date: Thu Oct 08 2026 - 12:31:17 EST


at91sam9x5_sckc_register() calls of_get_compatible_child() to look up the
"atmel,at91sam9x5-clk-slow-osc" and "atmel,at91sam9x5-clk-slow" legacy
child nodes during DT backward compatibility handling. Both calls return a
device node with its reference count incremented, but neither reference is
ever dropped: the first is simply overwritten when the second lookup
reassigns child, and the second is leaked on every return path, including
the unregister_slow_* cleanup labels. of_clk_add_hw_provider() takes its
own reference and does not consume the caller's.

Drop the slow-osc reference once it has been used and release the remaining
child reference on both the success and error paths.

Fixes: 45b5ec8498ff ("clk: at91: modernize sckc binding")
Assisted-by: DeepSeek-V4.1-Flash
Signed-off-by: Haotian Zhang <vulab@xxxxxxxxxxx>
---
drivers/clk/at91/sckc.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/clk/at91/sckc.c b/drivers/clk/at91/sckc.c
index 776118f14867..bdf6897a98e3 100644
--- a/drivers/clk/at91/sckc.c
+++ b/drivers/clk/at91/sckc.c
@@ -398,8 +398,9 @@ static void __init at91sam9x5_sckc_register(struct device_node *np,

xtal_name = of_clk_get_parent_name(child, 0);
bypass = of_property_read_bool(child, "atmel,osc-bypass");
+ of_node_put(child);

- child = of_get_compatible_child(np, "atmel,at91sam9x5-clk-slow");
+ child = of_get_compatible_child(np, "atmel,at91sam9x5-clk-slow");
} else {
bypass = of_property_read_bool(np, "atmel,osc-bypass");
}
@@ -431,6 +432,7 @@ static void __init at91sam9x5_sckc_register(struct device_node *np,
if (WARN_ON(ret))
goto unregister_slowck;

+ of_node_put(child);
return;

unregister_slowck:
@@ -439,6 +441,7 @@ static void __init at91sam9x5_sckc_register(struct device_node *np,
at91_clk_unregister_slow_osc(slow_osc);
unregister_slow_rc:
at91_clk_unregister_slow_rc_osc(slow_rc);
+ of_node_put(child);
}

static const struct clk_slow_bits at91sam9x5_bits = {
--
2.25.1