From 9741795408d2fb907256899cd9403dd57b917358 Mon Sep 17 00:00:00 2001
From: Marek Vasut <marek.vasut+renesas@gmail.com>
Date: Sun, 15 Mar 2020 15:57:14 +0100
Subject: [PATCH] net: smc911x: Fix potential memleak() in init fail path

Fix memleak in the init fail path, where if allocation or registration
of MDIO bus fails, then ethernet interface is not unregistered and the
private data are not freed, yet the probe function reports a failure.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Joe Hershberger <joe.hershberger@ni.com>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
---
 drivers/net/smc911x.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index ceb4f81215..4459da5945 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -282,15 +282,23 @@ int smc911x_initialize(u8 dev_num, int base_addr)
 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
 	int retval;
 	struct mii_dev *mdiodev = mdio_alloc();
-	if (!mdiodev)
+	if (!mdiodev) {
+		eth_unregister(dev);
+		free(dev);
 		return -ENOMEM;
+	}
+
 	strncpy(mdiodev->name, dev->name, MDIO_NAME_LEN);
 	mdiodev->read = smc911x_miiphy_read;
 	mdiodev->write = smc911x_miiphy_write;
 
 	retval = mdio_register(mdiodev);
-	if (retval < 0)
+	if (retval < 0) {
+		mdio_free(mdiodev);
+		eth_unregister(dev);
+		free(dev);
 		return retval;
+	}
 #endif
 
 	return 1;
-- 
2.39.5