Skip to content

Commit e05c549

Browse files
jhovoldkuba-moo
authored andcommitted
net: ti: icss-iep: fix device and OF node leaks at probe
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: c1e0230 ("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>
1 parent 3e13274 commit e05c549

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

drivers/net/ethernet/ti/icssg/icss_iep.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -685,11 +685,17 @@ struct icss_iep *icss_iep_get_idx(struct device_node *np, int idx)
685685
struct platform_device *pdev;
686686
struct device_node *iep_np;
687687
struct icss_iep *iep;
688+
int ret;
688689

689690
iep_np = of_parse_phandle(np, "ti,iep", idx);
690-
if (!iep_np || !of_device_is_available(iep_np))
691+
if (!iep_np)
691692
return ERR_PTR(-ENODEV);
692693

694+
if (!of_device_is_available(iep_np)) {
695+
of_node_put(iep_np);
696+
return ERR_PTR(-ENODEV);
697+
}
698+
693699
pdev = of_find_device_by_node(iep_np);
694700
of_node_put(iep_np);
695701

@@ -698,21 +704,28 @@ struct icss_iep *icss_iep_get_idx(struct device_node *np, int idx)
698704
return ERR_PTR(-EPROBE_DEFER);
699705

700706
iep = platform_get_drvdata(pdev);
701-
if (!iep)
702-
return ERR_PTR(-EPROBE_DEFER);
707+
if (!iep) {
708+
ret = -EPROBE_DEFER;
709+
goto err_put_pdev;
710+
}
703711

704712
device_lock(iep->dev);
705713
if (iep->client_np) {
706714
device_unlock(iep->dev);
707715
dev_err(iep->dev, "IEP is already acquired by %s",
708716
iep->client_np->name);
709-
return ERR_PTR(-EBUSY);
717+
ret = -EBUSY;
718+
goto err_put_pdev;
710719
}
711720
iep->client_np = np;
712721
device_unlock(iep->dev);
713-
get_device(iep->dev);
714722

715723
return iep;
724+
725+
err_put_pdev:
726+
put_device(&pdev->dev);
727+
728+
return ERR_PTR(ret);
716729
}
717730
EXPORT_SYMBOL_GPL(icss_iep_get_idx);
718731

0 commit comments

Comments
 (0)