Skip to content

Commit 830118b

Browse files
committed
Merge branch 'net-ethernet-fix-device-leaks'
Johan Hovold says: ==================== net: ethernet: fix device leaks This series fixes devices leaks stemming from failure to drop the reference taken by of_find_device_by_node(). ==================== Link: https://patch.msgid.link/20250725171213.880-1-johan@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 9063de6 + e05c549 commit 830118b

File tree

5 files changed

+36
-10
lines changed

5 files changed

+36
-10
lines changed

drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,10 @@ static int dpaa_get_ts_info(struct net_device *net_dev,
371371
of_node_put(ptp_node);
372372
}
373373

374-
if (ptp_dev)
374+
if (ptp_dev) {
375375
ptp = platform_get_drvdata(ptp_dev);
376+
put_device(&ptp_dev->dev);
377+
}
376378

377379
if (ptp)
378380
info->phc_index = ptp->phc_index;

drivers/net/ethernet/freescale/enetc/enetc_pf.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -829,19 +829,29 @@ static int enetc_pf_register_with_ierb(struct pci_dev *pdev)
829829
{
830830
struct platform_device *ierb_pdev;
831831
struct device_node *ierb_node;
832+
int ret;
832833

833834
ierb_node = of_find_compatible_node(NULL, NULL,
834835
"fsl,ls1028a-enetc-ierb");
835-
if (!ierb_node || !of_device_is_available(ierb_node))
836+
if (!ierb_node)
836837
return -ENODEV;
837838

839+
if (!of_device_is_available(ierb_node)) {
840+
of_node_put(ierb_node);
841+
return -ENODEV;
842+
}
843+
838844
ierb_pdev = of_find_device_by_node(ierb_node);
839845
of_node_put(ierb_node);
840846

841847
if (!ierb_pdev)
842848
return -EPROBE_DEFER;
843849

844-
return enetc_ierb_register_pf(ierb_pdev, pdev);
850+
ret = enetc_ierb_register_pf(ierb_pdev, pdev);
851+
852+
put_device(&ierb_pdev->dev);
853+
854+
return ret;
845855
}
846856

847857
static const struct enetc_si_ops enetc_psi_ops = {

drivers/net/ethernet/freescale/gianfar_ethtool.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1475,8 +1475,10 @@ static int gfar_get_ts_info(struct net_device *dev,
14751475
if (ptp_node) {
14761476
ptp_dev = of_find_device_by_node(ptp_node);
14771477
of_node_put(ptp_node);
1478-
if (ptp_dev)
1478+
if (ptp_dev) {
14791479
ptp = platform_get_drvdata(ptp_dev);
1480+
put_device(&ptp_dev->dev);
1481+
}
14801482
}
14811483

14821484
if (ptp)

drivers/net/ethernet/mediatek/mtk_wed.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2782,7 +2782,6 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
27822782
if (!pdev)
27832783
goto err_of_node_put;
27842784

2785-
get_device(&pdev->dev);
27862785
irq = platform_get_irq(pdev, 0);
27872786
if (irq < 0)
27882787
goto err_put_device;

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)