]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: netsec: fix error handling in netsec_register_mdio()
authorYang Yingliang <yangyingliang@huawei.com>
Wed, 19 Oct 2022 06:41:04 +0000 (14:41 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Nov 2022 14:57:51 +0000 (23:57 +0900)
[ Upstream commit 94423589689124e8cd145b38a1034be7f25835b2 ]

If phy_device_register() fails, phy_device_free() need be called to
put refcount, so memory of phy device and device name can be freed
in callback function.

If get_phy_device() fails, mdiobus_unregister() need be called,
or it will cause warning in mdiobus_free() and kobject is leaked.

Fixes: 533dd11a12f6 ("net: socionext: Add Synquacer NetSec driver")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Link: https://lore.kernel.org/r/20221019064104.3228892-1-yangyingliang@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/socionext/netsec.c

index ef3634d1b9f7fa25ff3f8fd3e5323b29e94c5b41..b9acee214bb6acb95fe40ba20f4796e0b25f4427 100644 (file)
@@ -1958,11 +1958,13 @@ static int netsec_register_mdio(struct netsec_priv *priv, u32 phy_addr)
                        ret = PTR_ERR(priv->phydev);
                        dev_err(priv->dev, "get_phy_device err(%d)\n", ret);
                        priv->phydev = NULL;
+                       mdiobus_unregister(bus);
                        return -ENODEV;
                }
 
                ret = phy_device_register(priv->phydev);
                if (ret) {
+                       phy_device_free(priv->phydev);
                        mdiobus_unregister(bus);
                        dev_err(priv->dev,
                                "phy_device_register err(%d)\n", ret);