Skip to content

Commit 6a192c0

Browse files
spandruvadajwrdegoede
authored andcommitted
platform/x86/intel/tpmi: Fix double free reported by Smatch
Fix warning: drivers/platform/x86/intel/tpmi.c:253 tpmi_create_device() warn: 'feature_vsec_dev' was already freed. If there is some error, feature_vsec_dev memory is freed as part of resource managed call intel_vsec_add_aux(). So, additional kfree() call is not required. Reordered res allocation and feature_vsec_dev, so that on error only res is freed. Reported-by: Dan Carpenter <[email protected]> Link: https://lore.kernel.org/platform-driver-x86/Y%2FxYR7WGiPayZu%2FR@kili/T/#u Fixes: 47731fd ("platform/x86/intel: Intel TPMI enumeration driver") Signed-off-by: Srinivas Pandruvada <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Hans de Goede <[email protected]> Reviewed-by: Hans de Goede <[email protected]>
1 parent 95ecf90 commit 6a192c0

File tree

1 file changed

+7
-7
lines changed
  • drivers/platform/x86/intel

1 file changed

+7
-7
lines changed

drivers/platform/x86/intel/tpmi.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -209,14 +209,14 @@ static int tpmi_create_device(struct intel_tpmi_info *tpmi_info,
209209
if (!name)
210210
return -EOPNOTSUPP;
211211

212-
feature_vsec_dev = kzalloc(sizeof(*feature_vsec_dev), GFP_KERNEL);
213-
if (!feature_vsec_dev)
212+
res = kcalloc(pfs->pfs_header.num_entries, sizeof(*res), GFP_KERNEL);
213+
if (!res)
214214
return -ENOMEM;
215215

216-
res = kcalloc(pfs->pfs_header.num_entries, sizeof(*res), GFP_KERNEL);
217-
if (!res) {
216+
feature_vsec_dev = kzalloc(sizeof(*feature_vsec_dev), GFP_KERNEL);
217+
if (!feature_vsec_dev) {
218218
ret = -ENOMEM;
219-
goto free_vsec;
219+
goto free_res;
220220
}
221221

222222
snprintf(feature_id_name, sizeof(feature_id_name), "tpmi-%s", name);
@@ -239,6 +239,8 @@ static int tpmi_create_device(struct intel_tpmi_info *tpmi_info,
239239
/*
240240
* intel_vsec_add_aux() is resource managed, no explicit
241241
* delete is required on error or on module unload.
242+
* feature_vsec_dev memory is also freed as part of device
243+
* delete.
242244
*/
243245
ret = intel_vsec_add_aux(vsec_dev->pcidev, &vsec_dev->auxdev.dev,
244246
feature_vsec_dev, feature_id_name);
@@ -249,8 +251,6 @@ static int tpmi_create_device(struct intel_tpmi_info *tpmi_info,
249251

250252
free_res:
251253
kfree(res);
252-
free_vsec:
253-
kfree(feature_vsec_dev);
254254

255255
return ret;
256256
}

0 commit comments

Comments
 (0)