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

From: Yehyeong Lee

Date: Mon Oct 12 2026 - 05:06:20 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/

Changes since v1 (patches 1 and 3 unchanged):
- patch 2: check the completion index against ARCMSR_MAX_FREECCB_NUM
(the pccb_pool size) rather than acb->maxFreeCCB, which
arcmsr_get_firmware_spec() can raise above it; and skip a bad entry
and continue rather than break, so the completion consumer index
still advances (clearing the entry to 0xffff on type F), instead of
stalling the queue.

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 | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)

--
2.43.0