[PATCH] hwtracing: intel_th: Fix resource double free on device_add() failure
From: Guangshuo Li
Date: Thu Apr 30 2026 - 02:22:53 EST
intel_th_device_add_resources() stores a kmemdup()'d resource array in
thdev->resource. The array is released from the device release callback
via intel_th_device_release() -> intel_th_device_free().
If device_add() fails in intel_th_subdevice_alloc(), the error path first
frees thdev->resource manually and then calls put_device(). Since the
device has been initialized and has a release callback, put_device() can
drop the final reference and call intel_th_device_free(), which frees
thdev->resource again.
Fix the error path by letting the release callback handle thdev->resource
and jumping directly to put_device() after device_add() failure.
This issue was found by a static analysis tool I am developing.
Fixes: a753bfcfdb1f ("intel_th: Make the switch allocate its subdevices")
Signed-off-by: Guangshuo Li <lgs201920130244@xxxxxxxxx>
---
drivers/hwtracing/intel_th/core.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c
index 3924e63e2eee..1d33c9e42c59 100644
--- a/drivers/hwtracing/intel_th/core.c
+++ b/drivers/hwtracing/intel_th/core.c
@@ -683,7 +683,7 @@ intel_th_subdevice_alloc(struct intel_th *th,
err = device_add(&thdev->dev);
if (err)
- goto fail_free_res;
+ goto fail_put_device;
/* need switch driver to be loaded to enumerate the rest */
if (subdev->type == INTEL_TH_SWITCH && !req) {
@@ -694,9 +694,6 @@ intel_th_subdevice_alloc(struct intel_th *th,
return thdev;
-fail_free_res:
- kfree(thdev->resource);
-
fail_put_device:
put_device(&thdev->dev);
--
2.43.0