fastrpc_get_args() uses find_vma() to look up the VMA for a user-provided
pointer and compute a DMA address offset. When the address falls in a gap
before the returned VMA, (ptr & PAGE_MASK) - vma->vm_start underflows,
corrupting the DMA address sent to the DSP.

Replace find_vma() with vma_lookup(), which returns NULL when the address
is not contained within any VMA.

Cc: [email protected]
Fixes: 80f3afd72bd4 ("misc: fastrpc: consider address offset before sending to 
DSP")
Reported-by: Yuhao Jiang <[email protected]>
Signed-off-by: Junrui Luo <[email protected]>
---
 drivers/misc/fastrpc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 47356a5d5804..31b709fe6ed1 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -1041,7 +1041,7 @@ static int fastrpc_get_args(u32 kernel, struct 
fastrpc_invoke_ctx *ctx)
                        pages[i].addr = ctx->maps[i]->dma_addr;
 
                        mmap_read_lock(current->mm);
-                       vma = find_vma(current->mm, ctx->args[i].ptr);
+                       vma = vma_lookup(current->mm, ctx->args[i].ptr);
                        if (vma)
                                pages[i].addr += (ctx->args[i].ptr & PAGE_MASK) 
-
                                                 vma->vm_start;

---
base-commit: 7aaa8047eafd0bd628065b15757d9b48c5f9c07d
change-id: 20260515-fixes-0071a59299e5

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

Reply via email to