]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
coresight: ETR: Fix ETR buffer use-after-free issue
authorXiaoqi Zhuang <xiaoqi.zhuang@oss.qualcomm.com>
Tue, 21 Oct 2025 08:45:25 +0000 (16:45 +0800)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 5 Nov 2025 16:06:06 +0000 (16:06 +0000)
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
drivers/hwtracing/coresight/coresight-tmc-etr.c

index b07fcdb3fe1a8c1f0ef1946d8a524ae321ffa1d2..800be06598c1b7a5e17eac1a926797bb2cad2e97 100644 (file)
@@ -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);