[PATCH] ASoC: Intel: SST: fix platform device leak on probe failure
From: Guangshuo Li
Date: Mon Sep 21 2026 - 03:42:56 EST
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@xxxxxxxxxxxxxxx
Signed-off-by: Guangshuo Li <lgs201920130244@xxxxxxxxx>
---
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