Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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+ #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: d4c3ed963e41 ("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

authored by

Shuicheng Lin and committed by
Ashutosh Dixit
a3187c0c 11035eab

+5 -7
+5 -7
drivers/gpu/drm/xe/xe_nvm.c
··· 164 164 ret = auxiliary_device_init(aux_dev); 165 165 if (ret) { 166 166 drm_err(&xe->drm, "xe-nvm aux init failed %d\n", ret); 167 - goto err; 167 + kfree(nvm); 168 + xe->nvm = NULL; 169 + return ret; 168 170 } 169 171 170 172 ret = auxiliary_device_add(aux_dev); 171 173 if (ret) { 172 174 drm_err(&xe->drm, "xe-nvm aux add failed %d\n", ret); 173 175 auxiliary_device_uninit(aux_dev); 174 - goto err; 176 + xe->nvm = NULL; 177 + return ret; 175 178 } 176 179 return devm_add_action_or_reset(xe->drm.dev, xe_nvm_fini, xe); 177 - 178 - err: 179 - kfree(nvm); 180 - xe->nvm = NULL; 181 - return ret; 182 180 }