Commit 35501ac3 authored by Xiaoqi Zhuang's avatar Xiaoqi Zhuang Committed by Suzuki K Poulose
Browse files

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: bd2767ec ("coresight: Fix run time warnings while reusing ETR buffer")
Signed-off-by: default avatarXiaoqi Zhuang <xiaoqi.zhuang@oss.qualcomm.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Tested-by: default avatarLeo Yan <leo.yan@arm.com>
Link: https://lore.kernel.org/r/20251021-fix_etr_issue-v3-1-99a2d066fee2@oss.qualcomm.com
parent dcb6fa37
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1250,6 +1250,13 @@ static struct etr_buf *tmc_etr_get_sysfs_buffer(struct coresight_device *csdev)
	 * with the lock released.
	 */
	raw_spin_lock_irqsave(&drvdata->spinlock, flags);

	/*
	 * If the ETR is already enabled, continue with the existing buffer.
	 */
	if (coresight_get_mode(csdev) == CS_MODE_SYSFS)
		goto out;

	sysfs_buf = READ_ONCE(drvdata->sysfs_buf);
	if (!sysfs_buf || (sysfs_buf->size != drvdata->size)) {
		raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);