]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
coresight: ultrasoc-smb: Fix OOB write in smb_sync_perf_buffer()
authorJunrui Luo <moonafterrain@outlook.com>
Thu, 4 Jun 2026 07:34:25 +0000 (15:34 +0800)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Thu, 4 Jun 2026 08:56:13 +0000 (09:56 +0100)
When the SMB sink is used as a perf AUX sink, smb_update_buffer() calls
smb_sync_perf_buffer() to copy hardware trace data into the perf AUX ring
buffer pages. It derives pg_idx = head >> PAGE_SHIFT from @head, which is
handle->head, and indexes dst_pages[pg_idx]. The pg_idx %= nr_pages
normalization is only applied after the first loop iteration.

This leaves the initial page index underived from the buffer size, which
can result in an out-of-bounds write past dst_pages[] when head exceeds
the AUX buffer size.

Normalize head modulo the AUX buffer size before deriving the page index
and offset, mirroring tmc_etr_sync_perf_buffer().

Fixes: 06f5c2926aaa ("drivers/coresight: Add UltraSoc System Memory Buffer driver")
Reported-by: Yuhao Jiang <danisjiang@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Junrui Luo <moonafterrain@outlook.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/SYBPR01MB788156B3380A36835DB22290AF102@SYBPR01MB7881.ausprd01.prod.outlook.com
drivers/hwtracing/coresight/ultrasoc-smb.c

index 5776f63468fa05df255d3dd716f621c37424c048..20a950b9dd4ff07a2975eb58195533d6cbcc0ede 100644 (file)
@@ -337,6 +337,7 @@ static void smb_sync_perf_buffer(struct smb_drv_data *drvdata,
        unsigned long to_copy;
        long pg_idx, pg_offset;
 
+       head %= (unsigned long)buf->nr_pages << PAGE_SHIFT;
        pg_idx = head >> PAGE_SHIFT;
        pg_offset = head & (PAGE_SIZE - 1);