Skip to content

Commit 8a44241

Browse files
ShuichengLinThomas Hellström
authored andcommitted
drm/xe/nvm: Fix double-free on aux add failure
After a successful auxiliary_device_init(), aux_dev->dev.release (xe_nvm_release_dev()) is responsible for the kfree(nvm). When there is failure with auxiliary_device_add(), driver will call auxiliary_device_uninit(), which call put_device(). So that the .release callback will be triggered to free the memory associated with the auxiliary_device. Move the kfree(nvm) into the auxiliary_device_init() failure path and remove the err goto path to fix below error. " [ 13.232905] ================================================================== [ 13.232911] BUG: KASAN: double-free in xe_nvm_init+0x751/0xf10 [xe] [ 13.233112] Free of addr ffff888120635000 by task systemd-udevd/273 [ 13.233120] CPU: 8 UID: 0 PID: 273 Comm: systemd-udevd Not tainted 6.19.0-rc2-lgci-xe-kernel+ qualcomm-linux#225 PREEMPT(voluntary) ... [ 13.233125] Call Trace: [ 13.233126] <TASK> [ 13.233127] dump_stack_lvl+0x7f/0xc0 [ 13.233132] print_report+0xce/0x610 [ 13.233136] ? kasan_complete_mode_report_info+0x5d/0x1e0 [ 13.233139] ? xe_nvm_init+0x751/0xf10 [xe] ... " v2: drop err goto path. (Alexander) Fixes: 7926ba2 ("drm/xe: defer free of NVM auxiliary container to device release callback") Reviewed-by: Nitin Gote <nitin.r.gote@intel.com> Reviewed-by: Brian Nguyen <brian3.nguyen@intel.com> Cc: Alexander Usyskin <alexander.usyskin@intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Suggested-by: Brian Nguyen <brian3.nguyen@intel.com> Signed-off-by: Shuicheng Lin <shuicheng.lin@intel.com> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Link: https://patch.msgid.link/20260120183239.2966782-7-shuicheng.lin@intel.com (cherry picked from commit a3187c0) Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
1 parent 2da8fbb commit 8a44241

1 file changed

Lines changed: 5 additions & 7 deletions

File tree

drivers/gpu/drm/xe/xe_nvm.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -153,19 +153,17 @@ int xe_nvm_init(struct xe_device *xe)
153153
ret = auxiliary_device_init(aux_dev);
154154
if (ret) {
155155
drm_err(&xe->drm, "xe-nvm aux init failed %d\n", ret);
156-
goto err;
156+
kfree(nvm);
157+
xe->nvm = NULL;
158+
return ret;
157159
}
158160

159161
ret = auxiliary_device_add(aux_dev);
160162
if (ret) {
161163
drm_err(&xe->drm, "xe-nvm aux add failed %d\n", ret);
162164
auxiliary_device_uninit(aux_dev);
163-
goto err;
165+
xe->nvm = NULL;
166+
return ret;
164167
}
165168
return devm_add_action_or_reset(xe->drm.dev, xe_nvm_fini, xe);
166-
167-
err:
168-
kfree(nvm);
169-
xe->nvm = NULL;
170-
return ret;
171169
}

0 commit comments

Comments
 (0)