[PATCH v3 0/3] scsi: arcmsr: bound adapter-supplied completion indices and message lengths

From: Yehyeong Lee

Date: Mon Oct 12 2026 - 07:41:34 EST


The arcmsr completion and message paths take several values straight
from the DMA area the adapter writes -- a completion slot number, a
type B completion-ring index, and an inbound message length -- and use
them as array subscripts or copy lengths without checking them against
the array or buffer they index. A malfunctioning or malicious adapter
can therefore drive an out-of-bounds access from the completion
interrupt or an ioctl.

Patch 1 clamps the firmware-supplied message length to the staging
window (heap out-of-bounds write). Patch 2 rejects a completion slot
the driver never handed out (wild pointer load and dereference on types
E and F). Patch 3 wraps the type B completion index before it is used
(out-of-bounds read, and an out-of-bounds store when the word read is
non-zero).

Each was reproduced on a KASAN build with a crafted DMA area; the
per-patch changelogs have the reports. The three are independent and
carry separate Fixes tags.

v1: https://lore.kernel.org/linux-scsi/cover.1791789900.git.yhlee@xxxxxxxxxxxxxxxxxx/
v2: https://lore.kernel.org/linux-scsi/cover.1791792888.git.yhlee@xxxxxxxxxxxxxxxxxx/

v3: patch 2 -- bound against maxFreeCCB (not the pool size) and clamp
maxFreeCCB to the pool at init, so the index cannot hit an
unpopulated (NULL) slot; v2's ARCMSR_MAX_FREECCB_NUM bound could.
patches 1, 3 unchanged.

v2: patch 2 -- bound against ARCMSR_MAX_FREECCB_NUM rather than
acb->maxFreeCCB, and on a reject release the entry and step the
queue index instead of stopping, so the consumer index does not fall
behind the producer. patches 1, 3 unchanged.

Yehyeong Lee (3):
scsi: arcmsr: bound the firmware-supplied message length
scsi: arcmsr: check the completion index the adapter reports
scsi: arcmsr: wrap the type B completion index before using it

drivers/scsi/arcmsr/arcmsr_hba.c | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)

--
2.43.0