]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: enetc: fix device and OF node leak at probe
authorJohan Hovold <johan@kernel.org>
Fri, 15 Aug 2025 19:54:16 +0000 (15:54 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:26:10 +0000 (16:26 +0200)
[ Upstream commit 70458f8a6b44daf3ad39f0d9b6d1097c8a7780ed ]

Make sure to drop the references to the IERB OF node and platform device
taken by of_parse_phandle() and of_find_device_by_node() during probe.

Fixes: e7d48e5fbf30 ("net: enetc: add a mini driver for the Integrated Endpoint Register Block")
Cc: stable@vger.kernel.org # 5.13
Cc: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250725171213.880-3-johan@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/freescale/enetc/enetc_pf.c

index bdf94335ee99ccb1b62055694b6a29f939a6f378..b84d5a66558adce47edd04982fa7295745d29261 100644 (file)
@@ -1207,6 +1207,7 @@ static int enetc_pf_register_with_ierb(struct pci_dev *pdev)
        struct device_node *node = pdev->dev.of_node;
        struct platform_device *ierb_pdev;
        struct device_node *ierb_node;
+       int ret;
 
        /* Don't register with the IERB if the PF itself is disabled */
        if (!node || !of_device_is_available(node))
@@ -1214,16 +1215,25 @@ static int enetc_pf_register_with_ierb(struct pci_dev *pdev)
 
        ierb_node = of_find_compatible_node(NULL, NULL,
                                            "fsl,ls1028a-enetc-ierb");
-       if (!ierb_node || !of_device_is_available(ierb_node))
+       if (!ierb_node)
                return -ENODEV;
 
+       if (!of_device_is_available(ierb_node)) {
+               of_node_put(ierb_node);
+               return -ENODEV;
+       }
+
        ierb_pdev = of_find_device_by_node(ierb_node);
        of_node_put(ierb_node);
 
        if (!ierb_pdev)
                return -EPROBE_DEFER;
 
-       return enetc_ierb_register_pf(ierb_pdev, pdev);
+       ret = enetc_ierb_register_pf(ierb_pdev, pdev);
+
+       put_device(&ierb_pdev->dev);
+
+       return ret;
 }
 
 static int enetc_pf_probe(struct pci_dev *pdev,