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@xxxxxxxxxxxxxxx> > Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@xxxxxxxxxx> > --- > 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@xxxxxxxxxxxx> Thanks, Thinh