mmc: mmc_spi: fix error handling in mmc_spi_probe()
authorYang Yingliang <yangyingliang@huawei.com>
Tue, 31 Jan 2023 01:38:35 +0000 (09:38 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Feb 2023 11:59:48 +0000 (12:59 +0100)
commit cf4c9d2ac1e42c7d18b921bec39486896645b714 upstream.

If mmc_add_host() fails, it doesn't need to call mmc_remove_host(),
or it will cause null-ptr-deref, because of deleting a not added
device in mmc_remove_host().

To fix this, goto label 'fail_glue_init', if mmc_add_host() fails,
and change the label 'fail_add_host' to 'fail_gpiod_request'.

Fixes: 15a0580ced08 ("mmc_spi host driver")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Cc:stable@vger.kernel.org
Link: https://lore.kernel.org/r/20230131013835.3564011-1-yangyingliang@huawei.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mmc/host/mmc_spi.c

index 106dd204b1a7f267a8538df6272c8993943e4cf5..cc333ad67cac81baf69a1c273a473496701c6e0e 100644 (file)
@@ -1437,7 +1437,7 @@ static int mmc_spi_probe(struct spi_device *spi)
 
        status = mmc_add_host(mmc);
        if (status != 0)
-               goto fail_add_host;
+               goto fail_glue_init;
 
        /*
         * Index 0 is card detect
@@ -1445,7 +1445,7 @@ static int mmc_spi_probe(struct spi_device *spi)
         */
        status = mmc_gpiod_request_cd(mmc, NULL, 0, false, 1000);
        if (status == -EPROBE_DEFER)
-               goto fail_add_host;
+               goto fail_gpiod_request;
        if (!status) {
                /*
                 * The platform has a CD GPIO signal that may support
@@ -1460,7 +1460,7 @@ static int mmc_spi_probe(struct spi_device *spi)
        /* Index 1 is write protect/read only */
        status = mmc_gpiod_request_ro(mmc, NULL, 1, 0);
        if (status == -EPROBE_DEFER)
-               goto fail_add_host;
+               goto fail_gpiod_request;
        if (!status)
                has_ro = true;
 
@@ -1474,7 +1474,7 @@ static int mmc_spi_probe(struct spi_device *spi)
                                ? ", cd polling" : "");
        return 0;
 
-fail_add_host:
+fail_gpiod_request:
        mmc_remove_host(mmc);
 fail_glue_init:
        mmc_spi_dma_free(host);