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.

coresight: ETR: Fix ETR buffer use-after-free issue

When ETR is enabled as CS_MODE_SYSFS, if the buffer size is changed
and enabled again, currently sysfs_buf will point to the newly
allocated memory(buf_new) and free the old memory(buf_old). But the
etr_buf that is being used by the ETR remains pointed to buf_old, not
updated to buf_new. In this case, it will result in a memory
use-after-free issue.

Fix this by checking ETR's mode before updating and releasing buf_old,
if the mode is CS_MODE_SYSFS, then skip updating and releasing it.

Fixes: bd2767ec3df2 ("coresight: Fix run time warnings while reusing ETR buffer")
Signed-off-by: Xiaoqi Zhuang <xiaoqi.zhuang@oss.qualcomm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Tested-by: Leo Yan <leo.yan@arm.com>
Link: https://lore.kernel.org/r/20251021-fix_etr_issue-v3-1-99a2d066fee2@oss.qualcomm.com

authored by

Xiaoqi Zhuang and committed by
Suzuki K Poulose
35501ac3 dcb6fa37

+7
+7
drivers/hwtracing/coresight/coresight-tmc-etr.c
··· 1250 1250 * with the lock released. 1251 1251 */ 1252 1252 raw_spin_lock_irqsave(&drvdata->spinlock, flags); 1253 + 1254 + /* 1255 + * If the ETR is already enabled, continue with the existing buffer. 1256 + */ 1257 + if (coresight_get_mode(csdev) == CS_MODE_SYSFS) 1258 + goto out; 1259 + 1253 1260 sysfs_buf = READ_ONCE(drvdata->sysfs_buf); 1254 1261 if (!sysfs_buf || (sysfs_buf->size != drvdata->size)) { 1255 1262 raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);