summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLing Xu <quic_lxu5@quicinc.com>2025-09-12 14:12:34 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-10-15 11:56:40 +0200
commitec5cb80503bbfee67573699fe52fcf456fd57678 (patch)
treea97475cbef0982718f0379c22e9fc8861970be57
parentbc8b56317ff83ef4bba89bda356b93978604694f (diff)
downloadlinux-ec5cb80503bbfee67573699fe52fcf456fd57678.tar.gz
linux-ec5cb80503bbfee67573699fe52fcf456fd57678.tar.bz2
linux-ec5cb80503bbfee67573699fe52fcf456fd57678.zip
misc: fastrpc: Fix fastrpc_map_lookup operation
commit 9031626ade38b092b72638dfe0c6ffce8d8acd43 upstream. Fastrpc driver creates maps for user allocated fd buffers. Before creating a new map, the map list is checked for any already existing maps using map fd. Checking with just map fd is not sufficient as the user can pass offsetted buffer with less size when the map is created and then a larger size the next time which could result in memory issues. Check for dma_buf object also when looking up for the map. Fixes: c68cfb718c8f ("misc: fastrpc: Add support for context Invoke method") Cc: stable@kernel.org 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@oss.qualcomm.com> Signed-off-by: Srinivas Kandagatla <srini@kernel.org> Link: https://lore.kernel.org/r/20250912131236.303102-3-srini@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/misc/fastrpc.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 0722de355e6e..1384d7a9f08a 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -346,11 +346,16 @@ static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
{
struct fastrpc_session_ctx *sess = fl->sctx;
struct fastrpc_map *map = NULL;
+ struct dma_buf *buf;
int ret = -ENOENT;
+ buf = dma_buf_get(fd);
+ if (IS_ERR(buf))
+ return PTR_ERR(buf);
+
spin_lock(&fl->lock);
list_for_each_entry(map, &fl->maps, node) {
- if (map->fd != fd)
+ if (map->fd != fd || map->buf != buf)
continue;
if (take_ref) {