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

peci: cpu: Fix use-after-free in adev_release()

When auxiliary_device_add() returns an error, auxiliary_device_uninit()
is called, which causes refcount for device to be decremented and
.release callback will be triggered.

Because adev_release() re-calls auxiliary_device_uninit(), it will cause
use-after-free:
[ 1269.455172] WARNING: CPU: 0 PID: 14267 at lib/refcount.c:28 refcount_warn_saturate+0x110/0x15
[ 1269.464007] refcount_t: underflow; use-after-free.

Reported-by: Jianglei Nie <niejianglei2021@163.com>
Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
Link: https://lore.kernel.org/r/20220705101501.298395-1-iwona.winiarska@intel.com

+1 -2
+1 -2
drivers/peci/cpu.c
··· 188 188 { 189 189 struct auxiliary_device *adev = to_auxiliary_dev(dev); 190 190 191 - auxiliary_device_uninit(adev); 192 - 193 191 kfree(adev->name); 194 192 kfree(adev); 195 193 } ··· 232 234 struct auxiliary_device *adev = _adev; 233 235 234 236 auxiliary_device_delete(adev); 237 + auxiliary_device_uninit(adev); 235 238 } 236 239 237 240 static int devm_adev_add(struct device *dev, int idx)