diff mbox series

[1/1] mmc: fix potential memleaks in mmc_omap_new_slot

Message ID 20230715132449.2217-1-ruc_gongyuanjun@163.com (mailing list archive)
State New, archived
Headers show
Series [1/1] mmc: fix potential memleaks in mmc_omap_new_slot | expand

Commit Message

Yuanjun Gong July 15, 2023, 1:24 p.m. UTC
'mmc' allocated by mmc_alloc_host is not freed on the error paths
of gpiod_get_index_optional(), causing memory leaks.

Signed-off-by: Yuanjun Gong <ruc_gongyuanjun@163.com>
---
 drivers/mmc/host/omap.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
index 6a259563690d..eeb5a1b493d9 100644
--- a/drivers/mmc/host/omap.c
+++ b/drivers/mmc/host/omap.c
@@ -1261,19 +1261,25 @@  static int mmc_omap_new_slot(struct mmc_omap_host *host, int id)
 	/* Check for some optional GPIO controls */
 	slot->vsd = gpiod_get_index_optional(host->dev, "vsd",
 					     id, GPIOD_OUT_LOW);
-	if (IS_ERR(slot->vsd))
-		return dev_err_probe(host->dev, PTR_ERR(slot->vsd),
+	if (IS_ERR(slot->vsd)){
+		r = dev_err_probe(host->dev, PTR_ERR(slot->vsd),
 				     "error looking up VSD GPIO\n");
+		goto err_free_host;
+	}
 	slot->vio = gpiod_get_index_optional(host->dev, "vio",
 					     id, GPIOD_OUT_LOW);
-	if (IS_ERR(slot->vio))
-		return dev_err_probe(host->dev, PTR_ERR(slot->vio),
+	if (IS_ERR(slot->vio)){
+		r = dev_err_probe(host->dev, PTR_ERR(slot->vio),
 				     "error looking up VIO GPIO\n");
+		goto err_free_host;
+	}
 	slot->cover = gpiod_get_index_optional(host->dev, "cover",
 						id, GPIOD_IN);
-	if (IS_ERR(slot->cover))
-		return dev_err_probe(host->dev, PTR_ERR(slot->cover),
+	if (IS_ERR(slot->cover)){
+		r = dev_err_probe(host->dev, PTR_ERR(slot->cover),
 				     "error looking up cover switch GPIO\n");
+		goto err_free_host;
+	}		
 
 	host->slots[id] = slot;
 
@@ -1333,6 +1339,7 @@  static int mmc_omap_new_slot(struct mmc_omap_host *host, int id)
 		device_remove_file(&mmc->class_dev, &dev_attr_slot_name);
 err_remove_host:
 	mmc_remove_host(mmc);
+err_free_host:
 	mmc_free_host(mmc);
 	return r;
 }