From: Atul Akella <atul.akella@gmail.com>
To: andersson@kernel.org, mathieu.poirier@linaro.org,
sibi.sankar@oss.qualcomm.com, quic_srichara@quicinc.com
Cc: linux-remoteproc@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-kernel@vger.kernel.org, Atul Akella <atul.akella@gmail.com>,
stable@vger.kernel.org
Subject: [PATCH 1/4] remoteproc: qcom: Fix bounds check in adsp_da_to_va()
Date: Sat, 7 Nov 2026 00:13:08 +0530 [thread overview]
Message-ID: <20261106184312.100-2-atul.akella@gmail.com> (raw)
In-Reply-To: <20261106184312.100-1-atul.akella@gmail.com>
offset is calculated as da - adsp->mem_reloc and stored in a
32 bit signed int, while da and adsp->mem_reloc are both u64.
For a sufficiently small da, the 64bit difference is truncated
into the 32 bit int, bypassing the offset < 0 underflow check
with a small positive value. Additionally, offset + len >
adsp->mem_size can itself overflow when offset and len are both
large, providing a second bypass.
da and len come from firmware's ELF program headers via
rproc_da_to_va(), and the result is used by the ELF loader
to write firmware segments, so a malformed firmware image can
cause writes outside the carveout.
Rewrite the bounds check entirely in u64 arithmetic. Reject
underflow before computing offset (da < adsp->mem_reloc).
Replace the addition based overflow check with a
subtraction based one (len > adsp->mem_size - offset) so no
intermediate sum can wrap.
Fixes: dc160e449122 ("remoteproc: qcom: Introduce Non-PAS ADSP PIL driver")
Cc: stable@vger.kernel.org
Signed-off-by: Atul Akella <atul.akella@gmail.com>
---
drivers/remoteproc/qcom_q6v5_adsp.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index 46d9169a37f6..1bf87cd0e9dd 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -486,10 +486,12 @@ static int adsp_stop(struct rproc *rproc)
static void *adsp_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
{
struct qcom_adsp *adsp = rproc->priv;
- int offset;
+ u64 offset;
+ if (da < adsp->mem_reloc)
+ return NULL;
offset = da - adsp->mem_reloc;
- if (offset < 0 || offset + len > adsp->mem_size)
+ if (offset > adsp->mem_size || len > adsp->mem_size - offset)
return NULL;
return (__force void *)adsp->mem_region + offset;
--
2.43.0
next prev parent reply other threads:[~2026-11-06 18:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 18:43 [PATCH 0/4] remoteproc: qcom: Fix DA-to-VA bounds checks Atul Akella
2026-11-06 18:43 ` Atul Akella [this message]
2026-11-06 18:43 ` [PATCH 2/4] remoteproc: qcom: Fix bounds check in qcom_pas_da_to_va() Atul Akella
2026-11-06 18:43 ` [PATCH 3/4] remoteproc: qcom: Fix bounds check in q6v5_wcss_da_to_va() Atul Akella
2026-11-06 18:43 ` [PATCH 4/4] remoteproc: qcom: Fix bounds check in wcnss_da_to_va() Atul Akella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261106184312.100-2-atul.akella@gmail.com \
--to=atul.akella@gmail.com \
--cc=andersson@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
--cc=quic_srichara@quicinc.com \
--cc=sibi.sankar@oss.qualcomm.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.