spufs_mem_mmap_access() computes the local store offset as
address - vma->vm_start, but bounds-checks it against vma->vm_end
instead of the local store size. On 64-bit, offset is always well
below vma->vm_end, so the clamp never fires and len stays unbounded
against the LS_SIZE buffer returned by ctx->ops->get_ls().

Reject offsets at or beyond LS_SIZE and clamp len to the remaining
space, mirroring the guard already used by spufs_mem_mmap_fault() and
spufs_ps_fault().

Fixes: a352894d0705 ("spufs: use new vm_ops->access to allow local state access 
from gdb")
Reported-by: Yuhao Jiang <[email protected]>
Cc: [email protected]
Signed-off-by: Junrui Luo <[email protected]>
---
 arch/powerpc/platforms/cell/spufs/file.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/platforms/cell/spufs/file.c 
b/arch/powerpc/platforms/cell/spufs/file.c
index 10fa9b844fcc..94c1ffa8792e 100644
--- a/arch/powerpc/platforms/cell/spufs/file.c
+++ b/arch/powerpc/platforms/cell/spufs/file.c
@@ -268,10 +268,12 @@ static int spufs_mem_mmap_access(struct vm_area_struct 
*vma,
 
        if (write && !(vma->vm_flags & VM_WRITE))
                return -EACCES;
+       if (offset >= LS_SIZE)
+               return -EFAULT;
        if (spu_acquire(ctx))
                return -EINTR;
-       if ((offset + len) > vma->vm_end)
-               len = vma->vm_end - offset;
+       if ((offset + len) > LS_SIZE)
+               len = LS_SIZE - offset;
        local_store = ctx->ops->get_ls(ctx);
        if (write)
                memcpy_toio(local_store + offset, buf, len);

---
base-commit: c369299895a591d96745d6492d4888259b004a9e
change-id: 20260601-fixes-e7319a0b4db2

Best regards,
-- 
Junrui Luo <[email protected]>


Reply via email to