]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: ti: icss-iep: fix device and OF node leaks at probe
authorJohan Hovold <johan@kernel.org>
Fri, 25 Jul 2025 17:12:13 +0000 (19:12 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 31 Jul 2025 01:02:48 +0000 (18:02 -0700)
Make sure to drop the references to the IEP OF node and device taken by
of_parse_phandle() and of_find_device_by_node() when looking up IEP
devices during probe.

Drop the bogus additional reference taken on successful lookup so that
the device is released correctly by icss_iep_put().

Fixes: c1e0230eeaab ("net: ti: icss-iep: Add IEP driver")
Cc: stable@vger.kernel.org # 6.6
Cc: Roger Quadros <rogerq@kernel.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250725171213.880-6-johan@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/icssg/icss_iep.c

index 2a1c43316f462bbfb9176f6e8d86f326779a52d5..50bfbc2779e473975d9104b4b63d94a1b3055da1 100644 (file)
@@ -685,11 +685,17 @@ struct icss_iep *icss_iep_get_idx(struct device_node *np, int idx)
        struct platform_device *pdev;
        struct device_node *iep_np;
        struct icss_iep *iep;
+       int ret;
 
        iep_np = of_parse_phandle(np, "ti,iep", idx);
-       if (!iep_np || !of_device_is_available(iep_np))
+       if (!iep_np)
                return ERR_PTR(-ENODEV);
 
+       if (!of_device_is_available(iep_np)) {
+               of_node_put(iep_np);
+               return ERR_PTR(-ENODEV);
+       }
+
        pdev = of_find_device_by_node(iep_np);
        of_node_put(iep_np);
 
@@ -698,21 +704,28 @@ struct icss_iep *icss_iep_get_idx(struct device_node *np, int idx)
                return ERR_PTR(-EPROBE_DEFER);
 
        iep = platform_get_drvdata(pdev);
-       if (!iep)
-               return ERR_PTR(-EPROBE_DEFER);
+       if (!iep) {
+               ret = -EPROBE_DEFER;
+               goto err_put_pdev;
+       }
 
        device_lock(iep->dev);
        if (iep->client_np) {
                device_unlock(iep->dev);
                dev_err(iep->dev, "IEP is already acquired by %s",
                        iep->client_np->name);
-               return ERR_PTR(-EBUSY);
+               ret = -EBUSY;
+               goto err_put_pdev;
        }
        iep->client_np = np;
        device_unlock(iep->dev);
-       get_device(iep->dev);
 
        return iep;
+
+err_put_pdev:
+       put_device(&pdev->dev);
+
+       return ERR_PTR(ret);
 }
 EXPORT_SYMBOL_GPL(icss_iep_get_idx);