aboutsummaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorSiarhei Yasinski <siarhei.yasinski@sintecs.eu>2022-08-31 10:57:37 +0000
committerPeng Fan <peng.fan@nxp.com>2022-09-06 09:28:47 +0800
commit5025224fadc01ec2e8c50e41b765c597dfd40dba (patch)
tree1e1838d952b064781edaced24da55c27243feae3 /drivers/net
parent6f6fbb334cc72cd5183cfe9a5b9fd31bc5d404d7 (diff)
downloadu-boot-5025224fadc01ec2e8c50e41b765c597dfd40dba.zip
u-boot-5025224fadc01ec2e8c50e41b765c597dfd40dba.tar.gz
u-boot-5025224fadc01ec2e8c50e41b765c597dfd40dba.tar.bz2
net: enetc: Fix use after free issue in fsl_enetc.c
If ethernet connected to SFP, like this: &enetc_port0 { phy-connection-type = "sgmii"; sfp = <&sfp0>; managed = "in-band-status"; status = "okay"; }; Then enetc_config_phy returns -ENODEV and the memory containing the mdio interface is freed. It's better to unregister and free mdio resources. Signed-off-by: Siarhei Yasinski <siarhei.yasinski@sintecs.eu> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Ramon Fried <rfried.dev@gmail.com> Signed-off-by: Peng Fan <peng.fan@nxp.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/fsl_enetc.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/fsl_enetc.c b/drivers/net/fsl_enetc.c
index cd4c2c2..835e5bd 100644
--- a/drivers/net/fsl_enetc.c
+++ b/drivers/net/fsl_enetc.c
@@ -22,6 +22,8 @@
#define ENETC_DRIVER_NAME "enetc_eth"
+static int enetc_remove(struct udevice *dev);
+
/*
* sets the MAC address in IERB registers, this setting is persistent and
* carried over to Linux.
@@ -319,6 +321,7 @@ static int enetc_config_phy(struct udevice *dev)
static int enetc_probe(struct udevice *dev)
{
struct enetc_priv *priv = dev_get_priv(dev);
+ int res;
if (ofnode_valid(dev_ofnode(dev)) && !ofnode_is_available(dev_ofnode(dev))) {
enetc_dbg(dev, "interface disabled\n");
@@ -350,7 +353,10 @@ static int enetc_probe(struct udevice *dev)
enetc_start_pcs(dev);
- return enetc_config_phy(dev);
+ res = enetc_config_phy(dev);
+ if(res)
+ enetc_remove(dev);
+ return res;
}
/*