diff mbox series

[1/2] usb: dwc3: st: fix probed platform device ref count on probe error path

Message ID 20240814093957.37940-1-krzysztof.kozlowski@linaro.org (mailing list archive)
State New, archived
Headers show
Series [1/2] usb: dwc3: st: fix probed platform device ref count on probe error path | expand

Commit Message

Krzysztof Kozlowski Aug. 14, 2024, 9:39 a.m. UTC
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>
---
 drivers/usb/dwc3/dwc3-st.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

Comments

Patrice CHOTARD Aug. 14, 2024, 3:34 p.m. UTC | #1
On 8/14/24 11:39, Krzysztof Kozlowski wrote:
> The probe function never performs any paltform device allocation, thus

Hi Krzysztof

s/paltform/platform

> 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>
> ---
>  drivers/usb/dwc3/dwc3-st.c | 11 +++--------
>  1 file changed, 3 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/dwc3-st.c b/drivers/usb/dwc3/dwc3-st.c
> index 211360eee95a..a9cb04043f08 100644
> --- a/drivers/usb/dwc3/dwc3-st.c
> +++ b/drivers/usb/dwc3/dwc3-st.c
> @@ -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 @@ static int st_dwc3_probe(struct platform_device *pdev)
>  	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;
>  }
>  

Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Thanks
Patrice
Thinh Nguyen Aug. 14, 2024, 11:11 p.m. UTC | #2
On Wed, Aug 14, 2024, Krzysztof Kozlowski wrote:
> 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>
> ---
>  drivers/usb/dwc3/dwc3-st.c | 11 +++--------
>  1 file changed, 3 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/dwc3-st.c b/drivers/usb/dwc3/dwc3-st.c
> index 211360eee95a..a9cb04043f08 100644
> --- a/drivers/usb/dwc3/dwc3-st.c
> +++ b/drivers/usb/dwc3/dwc3-st.c
> @@ -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 @@ static int st_dwc3_probe(struct platform_device *pdev)
>  	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;
>  }
>  
> -- 
> 2.43.0
> 

Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

Thanks,
Thinh
diff mbox series

Patch

diff --git a/drivers/usb/dwc3/dwc3-st.c b/drivers/usb/dwc3/dwc3-st.c
index 211360eee95a..a9cb04043f08 100644
--- a/drivers/usb/dwc3/dwc3-st.c
+++ b/drivers/usb/dwc3/dwc3-st.c
@@ -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 @@  static int st_dwc3_probe(struct platform_device *pdev)
 	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;
 }