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:58:09 +0200
commit6e0d6cc39f410a4d9ea774fbb254c68fe02ff4bb (patch)
tree346278c3e9df89f9258554c7d5c3abd77201fe9f
parentb808a3590c2884ca91316dbadbfcc1924f5893c7 (diff)
downloadlinux-6e0d6cc39f410a4d9ea774fbb254c68fe02ff4bb.tar.gz
linux-6e0d6cc39f410a4d9ea774fbb254c68fe02ff4bb.tar.bz2
linux-6e0d6cc39f410a4d9ea774fbb254c68fe02ff4bb.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 fc021e265edc..81f5cb98617e 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -366,11 +366,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) {