Skip to content

Commit 8b5b456

Browse files
quic-lxu5gregkh
authored andcommitted
misc: fastrpc: Save actual DMA size in fastrpc_map structure
For user passed fd buffer, map is created using DMA calls. The map related information is stored in fastrpc_map structure. The actual DMA size is not stored in the structure. Store the actual size of buffer and check it against the user passed size. Fixes: c68cfb7 ("misc: fastrpc: Add support for context Invoke method") Cc: stable@kernel.org Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Co-developed-by: Ekansh Gupta <ekansh.gupta@oss.qualcomm.com> Signed-off-by: Ekansh Gupta <ekansh.gupta@oss.qualcomm.com> Signed-off-by: Ling Xu <quic_lxu5@quicinc.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Signed-off-by: Srinivas Kandagatla <srini@kernel.org> Link: https://lore.kernel.org/r/20250912131236.303102-2-srini@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 810b790 commit 8b5b456

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

drivers/misc/fastrpc.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,11 @@ static void fastrpc_free_map(struct kref *ref)
323323

324324
perm.vmid = QCOM_SCM_VMID_HLOS;
325325
perm.perm = QCOM_SCM_PERM_RWX;
326-
err = qcom_scm_assign_mem(map->phys, map->size,
326+
err = qcom_scm_assign_mem(map->phys, map->len,
327327
&src_perms, &perm, 1);
328328
if (err) {
329329
dev_err(map->fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d\n",
330-
map->phys, map->size, err);
330+
map->phys, map->len, err);
331331
return;
332332
}
333333
}
@@ -758,7 +758,8 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
758758
struct fastrpc_session_ctx *sess = fl->sctx;
759759
struct fastrpc_map *map = NULL;
760760
struct sg_table *table;
761-
int err = 0;
761+
struct scatterlist *sgl = NULL;
762+
int err = 0, sgl_index = 0;
762763

763764
if (!fastrpc_map_lookup(fl, fd, ppmap, true))
764765
return 0;
@@ -798,7 +799,15 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
798799
map->phys = sg_dma_address(map->table->sgl);
799800
map->phys += ((u64)fl->sctx->sid << 32);
800801
}
801-
map->size = len;
802+
for_each_sg(map->table->sgl, sgl, map->table->nents,
803+
sgl_index)
804+
map->size += sg_dma_len(sgl);
805+
if (len > map->size) {
806+
dev_dbg(sess->dev, "Bad size passed len 0x%llx map size 0x%llx\n",
807+
len, map->size);
808+
err = -EINVAL;
809+
goto map_err;
810+
}
802811
map->va = sg_virt(map->table->sgl);
803812
map->len = len;
804813

@@ -815,10 +824,10 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
815824
dst_perms[1].vmid = fl->cctx->vmperms[0].vmid;
816825
dst_perms[1].perm = QCOM_SCM_PERM_RWX;
817826
map->attr = attr;
818-
err = qcom_scm_assign_mem(map->phys, (u64)map->size, &src_perms, dst_perms, 2);
827+
err = qcom_scm_assign_mem(map->phys, (u64)map->len, &src_perms, dst_perms, 2);
819828
if (err) {
820829
dev_err(sess->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d\n",
821-
map->phys, map->size, err);
830+
map->phys, map->len, err);
822831
goto map_err;
823832
}
824833
}
@@ -2046,7 +2055,7 @@ static int fastrpc_req_mem_map(struct fastrpc_user *fl, char __user *argp)
20462055
args[0].length = sizeof(req_msg);
20472056

20482057
pages.addr = map->phys;
2049-
pages.size = map->size;
2058+
pages.size = map->len;
20502059

20512060
args[1].ptr = (u64) (uintptr_t) &pages;
20522061
args[1].length = sizeof(pages);
@@ -2061,7 +2070,7 @@ static int fastrpc_req_mem_map(struct fastrpc_user *fl, char __user *argp)
20612070
err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, sc, &args[0]);
20622071
if (err) {
20632072
dev_err(dev, "mem mmap error, fd %d, vaddr %llx, size %lld\n",
2064-
req.fd, req.vaddrin, map->size);
2073+
req.fd, req.vaddrin, map->len);
20652074
goto err_invoke;
20662075
}
20672076

@@ -2074,7 +2083,7 @@ static int fastrpc_req_mem_map(struct fastrpc_user *fl, char __user *argp)
20742083
if (copy_to_user((void __user *)argp, &req, sizeof(req))) {
20752084
/* unmap the memory and release the buffer */
20762085
req_unmap.vaddr = (uintptr_t) rsp_msg.vaddr;
2077-
req_unmap.length = map->size;
2086+
req_unmap.length = map->len;
20782087
fastrpc_req_mem_unmap_impl(fl, &req_unmap);
20792088
return -EFAULT;
20802089
}

0 commit comments

Comments
 (0)