]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: dwc3: st: fix probed platform device ref count on probe error path
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Wed, 14 Aug 2024 09:39:56 +0000 (11:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 22 Aug 2024 09:34:26 +0000 (17:34 +0800)
The probe function never performs any paltform device allocation, thus
error path "undo_platform_dev_alloc" is entirely bogus.  It drops the
reference count from the platform device being probed.  If error path is
triggered, this will lead to unbalanced device reference counts and
premature release of device resources, thus possible use-after-free when
releasing remaining devm-managed resources.

Fixes: f83fca0707c6 ("usb: dwc3: add ST dwc3 glue layer to manage dwc3 HC")
Cc: stable@vger.kernel.org
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
Link: https://lore.kernel.org/r/20240814093957.37940-1-krzysztof.kozlowski@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/dwc3-st.c

index 211360eee95a0f383b96ed791e3bdf99fa4b4364..a9cb04043f08ed34a06b35e0918c540bf381b688 100644 (file)
@@ -219,10 +219,8 @@ static int st_dwc3_probe(struct platform_device *pdev)
        dwc3_data->regmap = regmap;
 
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "syscfg-reg");
-       if (!res) {
-               ret = -ENXIO;
-               goto undo_platform_dev_alloc;
-       }
+       if (!res)
+               return -ENXIO;
 
        dwc3_data->syscfg_reg_off = res->start;
 
@@ -233,8 +231,7 @@ static int st_dwc3_probe(struct platform_device *pdev)
                devm_reset_control_get_exclusive(dev, "powerdown");
        if (IS_ERR(dwc3_data->rstc_pwrdn)) {
                dev_err(&pdev->dev, "could not get power controller\n");
-               ret = PTR_ERR(dwc3_data->rstc_pwrdn);
-               goto undo_platform_dev_alloc;
+               return PTR_ERR(dwc3_data->rstc_pwrdn);
        }
 
        /* Manage PowerDown */
@@ -300,8 +297,6 @@ undo_softreset:
        reset_control_assert(dwc3_data->rstc_rst);
 undo_powerdown:
        reset_control_assert(dwc3_data->rstc_pwrdn);
-undo_platform_dev_alloc:
-       platform_device_put(pdev);
        return ret;
 }