diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index 3cf9ba563cfc..c3603eb6f538 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -813,6 +813,22 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) PAGE_SHIFT; pages[i].size = (pg_end - pg_start + 1) * PAGE_SIZE; + /* + * Check for page range overflow and validate page + * range is not greater than map buffer range. + * This prevents potential buffer overflow + * and memory corruption that could be exploited. + */ + if (pages[i].addr > (ULLONG_MAX - pages[i].size) || + (pages[i].addr + pages[i].size) > + (ctx->maps[i]->phys + ctx->maps[i]->size)) { + err = -EFAULT; + dev_err(dev, + "Invalid buffer addr 0x%llx len 0x%llx IPA 0x%llx size 0x%llx fd %d\n", + ctx->args[i].ptr, len, ctx->maps[i]->phys, + ctx->maps[i]->size, ctx->maps[i]->fd); + goto bail; + } } else { if (ctx->olaps[oix].offset == 0) {