sst_acpi_probe() registers platform devices for the SST platform and machine drivers using platform_device_register_data(), but does not unregister them when later probe steps fail. If machine device registration fails, the already registered SST platform device is left registered. The same leak happens when sst_platform_get_resources() or sst_context_init() fails after both platform devices have been successfully registered. A registered platform device owns resources allocated by the platform device core and must be released with platform_device_unregister() so that the device reference is dropped and platform_device_release() can free the backing platform_object. Unregister the created platform devices on all failure paths to restore the missing cleanup. The issue was identified by a static analysis tool I developed and confirmed by manual review. Fixes: caf94ed8629a ("ASoC: Intel: bytcr_rt5640: fixup DAI codec_name with HID") Cc: stable@vger.kernel.org Signed-off-by: Guangshuo Li --- sound/soc/intel/atom/sst/sst_acpi.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/sound/soc/intel/atom/sst/sst_acpi.c b/sound/soc/intel/atom/sst/sst_acpi.c index 73624e1b138a..a1f16083bd3d 100644 --- a/sound/soc/intel/atom/sst/sst_acpi.c +++ b/sound/soc/intel/atom/sst/sst_acpi.c @@ -352,7 +352,8 @@ static int sst_acpi_probe(struct platform_device *pdev) if (IS_ERR(mdev)) { dev_err(dev, "Failed to create machine device: %s\n", mach->drv_name); - return PTR_ERR(mdev); + ret = PTR_ERR(mdev); + goto err_unregister_plat_dev; } /* Fill sst platform data */ @@ -361,15 +362,21 @@ static int sst_acpi_probe(struct platform_device *pdev) ret = sst_platform_get_resources(ctx); if (ret) - return ret; + goto err_unregister_mdev; ret = sst_context_init(ctx); if (ret < 0) - return ret; + goto err_unregister_mdev; sst_configure_runtime_pm(ctx); platform_set_drvdata(pdev, ctx); return ret; + +err_unregister_mdev: + platform_device_unregister(mdev); +err_unregister_plat_dev: + platform_device_unregister(plat_dev); + return ret; } /** -- 2.43.0