]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mmc: omap: Fix memory leak in mmc_omap_new_slot
authorMiaoqian Lin <linmq006@gmail.com>
Tue, 18 Mar 2025 14:02:25 +0000 (22:02 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 19 Mar 2025 11:37:18 +0000 (12:37 +0100)
Add err_free_host label to properly pair mmc_alloc_host() with
mmc_free_host() in GPIO error paths. The allocated host memory was
leaked when GPIO lookups failed.

Fixes: e519f0bb64ef ("ARM/mmc: Convert old mmci-omap to GPIO descriptors")
Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20250318140226.19650-1-linmq006@gmail.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/omap.c

index 62252ad4e20de1bacb414157a382213fd3c6166d..3cdb2fc4496527ca19f6d4466da613a48af56e42 100644 (file)
@@ -1272,19 +1272,25 @@ static int mmc_omap_new_slot(struct mmc_omap_host *host, int id)
        /* Check for some optional GPIO controls */
        slot->vsd = devm_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 = devm_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 = devm_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;
 
@@ -1344,6 +1350,7 @@ err_remove_slot_name:
                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;
 }