[PATCH] edac: versalnet: Fix device_node leak in mc_probe()

Felix Gu posted 1 patch 1 week, 5 days ago
drivers/edac/versalnet_edac.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
[PATCH] edac: versalnet: Fix device_node leak in mc_probe()
Posted by Felix Gu 1 week, 5 days ago
of_parse_phandle() returns a device_node reference that must be released
with of_node_put(). The original code never freed r5_core_node on any
exit path, causing a memory leak.

Fix this by using the automatic cleanup attribute __free(device_node)
which ensures of_node_put() is called when the variable goes out of
scope.

Fixes: d5fe2fec6c40 ("EDAC: Add a driver for the AMD Versal NET DDR controller")
Signed-off-by: Felix Gu <ustc.gu@gmail.com>
---
 drivers/edac/versalnet_edac.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/edac/versalnet_edac.c b/drivers/edac/versalnet_edac.c
index 0b47ed7fed63..915bcd6166f7 100644
--- a/drivers/edac/versalnet_edac.c
+++ b/drivers/edac/versalnet_edac.c
@@ -888,12 +888,12 @@ static void remove_versalnet(struct mc_priv *priv)
 
 static int mc_probe(struct platform_device *pdev)
 {
-	struct device_node *r5_core_node;
 	struct mc_priv *priv;
 	struct rproc *rp;
 	int rc;
 
-	r5_core_node = of_parse_phandle(pdev->dev.of_node, "amd,rproc", 0);
+	struct device_node *r5_core_node __free(device_node) =
+		of_parse_phandle(pdev->dev.of_node, "amd,rproc", 0);
 	if (!r5_core_node) {
 		dev_err(&pdev->dev, "amd,rproc: invalid phandle\n");
 		return -EINVAL;

---
base-commit: 785f0eb2f85decbe7c1ef9ae922931f0194ffc2e
change-id: 20260322-versalnet-ee4feebc280e

Best regards,
-- 
Felix Gu <ustc.gu@gmail.com>
Re: [PATCH] edac: versalnet: Fix device_node leak in mc_probe()
Posted by Borislav Petkov 1 week, 5 days ago
On Mon, Mar 23, 2026 at 12:04:08AM +0800, Felix Gu wrote:
> of_parse_phandle() returns a device_node reference that must be released
> with of_node_put(). The original code never freed r5_core_node on any
> exit path, causing a memory leak.
> 
> Fix this by using the automatic cleanup attribute __free(device_node)
> which ensures of_node_put() is called when the variable goes out of
> scope.
> 
> Fixes: d5fe2fec6c40 ("EDAC: Add a driver for the AMD Versal NET DDR controller")
> Signed-off-by: Felix Gu <ustc.gu@gmail.com>
> ---
>  drivers/edac/versalnet_edac.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/edac/versalnet_edac.c b/drivers/edac/versalnet_edac.c
> index 0b47ed7fed63..915bcd6166f7 100644
> --- a/drivers/edac/versalnet_edac.c
> +++ b/drivers/edac/versalnet_edac.c
> @@ -888,12 +888,12 @@ static void remove_versalnet(struct mc_priv *priv)
>  
>  static int mc_probe(struct platform_device *pdev)
>  {
> -	struct device_node *r5_core_node;
>  	struct mc_priv *priv;
>  	struct rproc *rp;
>  	int rc;
>  
> -	r5_core_node = of_parse_phandle(pdev->dev.of_node, "amd,rproc", 0);
> +	struct device_node *r5_core_node __free(device_node) =
> +		of_parse_phandle(pdev->dev.of_node, "amd,rproc", 0);
>  	if (!r5_core_node) {
>  		dev_err(&pdev->dev, "amd,rproc: invalid phandle\n");
>  		return -EINVAL;
> 
> ---

Looks correct to me.

@Shubhrajyoti, can you pls test it?

Thx.

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette