All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Nilesh Javali" <njavali@marvell.com>
Cc: linux-scsi@vger.kernel.org
Subject: Re: [PATCH v2 06/60] scsi: qla2xxx: Add FC operational firmware load for 29xx
Date: Fri, 12 Jun 2026 10:14:19 +0000	[thread overview]
Message-ID: <20260612101419.69D491F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260612095333.1666592-7-njavali@marvell.com>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] Unconditional byte-swapping of `risc_attr` using `swab32()` instead of `be32_to_cpu()` causes endianness corruption.
- [High] Heap out-of-bounds read in `qla29xx_load_fw_template()` due to missing bounds check on `template_size`.
- [High] Out-of-bounds read in `qla29xx_load_risc_blob()` due to missing bounds checks on `array3_addr` dereferences.
- [High] Logic Error: Missing `BIT_1` (last chunk) flag due to flawed `is_last_chunk` calculation.
- [High] Integer overflow of firmware section offsets and lengths bypasses bounds checks on 32-bit systems.
--

commit 010601e8a1ad75507948f2ba92e178c2b94266b2
Author: Manish Rangankar <mrangankar@marvell.com>
scsi: qla2xxx: Add FC operational firmware load for 29xx

This commit adds support to load the 29xx FC operational firmware from the
filesystem and sets up the corresponding firmware dump template.

> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c

[ ... ]

> +static int qla29xx_process_rd_image(struct scsi_qla_host *vha,

[ ... ]

> +				is_last_chunk =
> +					(chunk == (chunks_per_segment - 1) ||
> +					 size_remainder < CHUNK_SIZE);

[Severity: High]
Does this logic accurately capture the final chunk when the remaining size is
exactly a multiple of the chunk size?

If the final segment's remaining size is exactly CHUNK_SIZE, size_remainder <
CHUNK_SIZE evaluates to false. Because it is a partial segment, the chunk
index will also be less than chunks_per_segment - 1. Since both conditions
are false, is_last_chunk becomes false. Could this cause the final chunk to
be sent without the BIT_1 flag, potentially hanging the firmware load?

[ ... ]

> +static int
> +qla29xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr)
> +{

[ ... ]

> +	header->header_length <<= 2;
> +	header->tim_length <<= 2;
> +	header->array1_length <<= 2;
> +	header->array2_length <<= 2;
> +	header->array3_length <<= 2;
> +	header->array4_length <<= 2;
> +
> +	if (!header->segment_size) {

[Severity: High]
Could these shifts result in integer overflow on 32-bit systems?

The firmware section lengths are multiplied by 4 without verifying if the
multiplication overflows.

[ ... ]

> +		/* Array 1 */
> +		offset += header->tim_length;
> +		if (offset + header->array1_length > fw_size) {
> +			ql_log(ql_log_fatal, vha, 0x0098,

If a crafted firmware image provides large section lengths (for instance,
0xFFFFFFFC), adding the offset could wrap around to a small value on 32-bit
architectures. Would this bypass the bounds check and cause the inner copy
loop in qla29xx_process_rd_image() to read past the end of the firmware
buffer?

[ ... ]

> +		/* Array 3: FW_DUMP template */
> +		if (offset + 10 * sizeof(__be32) > fw_size) {
> +			ql_log(ql_log_fatal, vha, 0x0098,
> +			       "FW image too small for risc_attr.\n");
> +			goto img_corrupt;
> +		}
> +		array1_addr = (__be32 *)((char *)fwcode +
> +				header->header_length +
> +				header->tim_length);
> +		risc_attr = swab32(array1_addr[9]);

[Severity: High]
Does using swab32() here cause endianness issues on big-endian architectures?

Since array1_addr is defined as an array of __be32, the data is already being
read in native memory order. Converting this to CPU endianness typically
requires be32_to_cpu(). Using an unconditional byte swap produces the correct
result on little-endian machines, but might corrupt the value on big-endian
systems, which could break the template count logic.

[ ... ]

> +	array3_addr = (__be32 *)(((char *)fwcode) + array3_offset);
> +	for (j = 0; j < templates; j++, fwdt++) {
> +		vfree(fwdt->template);
> +		fwdt->template = NULL;
> +		fwdt->length = 0;
> +
> +		array_size = be32_to_cpu(array3_addr[2]);

[Severity: High]
Is there a bounds check ensuring array3_addr has enough capacity before
dereferencing it?

While there is a check earlier to ensure array3_offset does not exceed the
total firmware size, that check allows the offset to sit exactly at the
end of the file. Dereferencing array3_addr[2] here might read past the end
of the buffer if the remaining size is less than 12 bytes.

[ ... ]

> +		fwdt->length = dlen;
> +		ql_dbg(ql_dbg_init, vha, 0x0168,
> +		       "-> fwdt%u loaded template ok\n", j);
> +
> +		array3_addr += array_size + 1;
> +	}

Additionally, if the loop continues for another template, array3_addr is
advanced and immediately dereferenced at the start of the next iteration
without validating if the new address remains within the firmware blob.
Could this also lead to an out-of-bounds read?

[ ... ]

> +static int
> +qla29xx_load_fw_template(scsi_qla_host_t *vha)
> +{

[ ... ]

> +	for (j = 0; j < templates; j++, fwdt++) {
> +		vfree(fwdt->template);
> +		fwdt->template = NULL;
> +		fwdt->length = 0;
> +
> +		template_size = le32_to_cpu(((__le32 *)fw_dump_tmplt)[2]);

[ ... ]

> +		fwdt->template = vmalloc(template_size);
> +		if (!fwdt->template) {
> +			ql_log(ql_log_warn, vha, 0x0164,
> +			       "-> fwdt%u failed allocate template.\n", j);
> +			goto failed;
> +		}
> +
> +		dcode = fwdt->template;
> +		memcpy((char *)dcode, (char *)fw_dump_tmplt, template_size);

[Severity: High]
Does template_size need to be validated against the actual size of the
fw_dump_tmplt allocation?

The template_size is read directly from the flash buffer data. Without
checking if template_size is less than or equal to ha->fw_dump_tmplt_len,
a malformed flash image specifying an excessively large template_size might
cause memcpy() to read out of bounds from the fw_dump_tmplt heap allocation.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260612095333.1666592-1-njavali@marvell.com?part=6

  reply	other threads:[~2026-06-12 10:14 UTC|newest]

Thread overview: 154+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-12  9:52 [PATCH v2 00/60] scsi: qla2xxx: Add QLA29xx series adapter support Nilesh Javali
2026-06-12  9:52 ` [PATCH v2 01/60] scsi: qla2xxx: Add 29xx series PCI device ID support Nilesh Javali
2026-06-12 10:30   ` sashiko-bot
2026-06-12 10:40   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 02/60] scsi: qla2xxx: Add flash read/write interface for 29xx Nilesh Javali
2026-06-12 10:16   ` sashiko-bot
2026-06-12 10:43   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 03/60] scsi: qla2xxx: Add NVRAM config support for 29xx adapters Nilesh Javali
2026-06-12 10:46   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 04/60] scsi: qla2xxx: Add get_flash_version " Nilesh Javali
2026-06-12 10:18   ` sashiko-bot
2026-06-12 10:48   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 05/60] scsi: qla2xxx: Add 29xx support in queue initialisation path Nilesh Javali
2026-06-12 10:17   ` sashiko-bot
2026-06-12 10:49   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 06/60] scsi: qla2xxx: Add FC operational firmware load for 29xx Nilesh Javali
2026-06-12 10:14   ` sashiko-bot [this message]
2026-06-12 10:52   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 07/60] scsi: qla2xxx: Add flash block read/write BSG support " Nilesh Javali
2026-06-12 10:11   ` sashiko-bot
2026-06-12 10:55   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 08/60] scsi: qla2xxx: Add BSG MPI firmware load/dump " Nilesh Javali
2026-06-12 10:14   ` sashiko-bot
2026-06-12 10:57   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 09/60] scsi: qla2xxx: Add 128-byte IOCB definitions " Nilesh Javali
2026-06-12 11:01   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 10/60] scsi: qla2xxx: Add extended status continuation and marker IOCBs Nilesh Javali
2026-06-12 11:02   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 11/60] scsi: qla2xxx: Remove duplicate flash memo block definitions Nilesh Javali
2026-06-12 11:03   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 12/60] scsi: qla2xxx: Update IO path to use 128-byte IOCBs for 29xx Nilesh Javali
2026-06-12 10:29   ` sashiko-bot
2026-06-12 11:12   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 13/60] scsi: qla2xxx: Replace IS_QLA29XX() size checks with entry-size helpers Nilesh Javali
2026-06-12 11:14   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 14/60] scsi: qla2xxx: Skip image-set-valid attribute for 29xx Nilesh Javali
2026-06-12 11:14   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 15/60] scsi: qla2xxx: Skip unsupported sysfs attributes " Nilesh Javali
2026-06-12 10:28   ` sashiko-bot
2026-06-12 11:15   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 16/60] scsi: qla2xxx: Enable get_fw_version mailbox " Nilesh Javali
2026-06-12 10:31   ` sashiko-bot
2026-06-12 11:16   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 17/60] scsi: qla2xxx: Extend execute_fw mailbox to include 29xx Nilesh Javali
2026-06-12 10:25   ` sashiko-bot
2026-06-12 11:17   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 18/60] scsi: qla2xxx: Enable get_adapter_id mailbox for 29xx Nilesh Javali
2026-06-12 11:18   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 19/60] scsi: qla2xxx: Enable init_firmware " Nilesh Javali
2026-06-12 11:18   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 20/60] scsi: qla2xxx: Enable get_firmware_state " Nilesh Javali
2026-06-12 11:19   ` Hannes Reinecke
2026-06-12 11:22   ` sashiko-bot
2026-06-12  9:52 ` [PATCH v2 21/60] scsi: qla2xxx: Enable serdes, resource count and FCE trace " Nilesh Javali
2026-06-12 10:38   ` sashiko-bot
2026-06-12 11:19   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 22/60] scsi: qla2xxx: Enable set_els_cmds and echo_test " Nilesh Javali
2026-06-12 11:20   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 23/60] scsi: qla2xxx: Add support for QLA29XX in data rate functions Nilesh Javali
2026-06-12 11:20   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 24/60] scsi: qla2xxx: Enable qla2x00_shutdown for 29xx Nilesh Javali
2026-06-12 11:21   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 25/60] scsi: qla2xxx: Use ring-slot helpers in __qla2x00_alloc_iocbs Nilesh Javali
2026-06-12 10:41   ` sashiko-bot
2026-06-12 11:21   ` Hannes Reinecke
2026-06-12  9:52 ` [PATCH v2 26/60] scsi: qla2xxx: Add support for QLA29XX in memory allocation Nilesh Javali
2026-06-12 10:40   ` sashiko-bot
2026-06-12 11:22   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 27/60] scsi: qla2xxx: Refactor marker IOCB handling for 29xx series Nilesh Javali
2026-06-12 11:36   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 28/60] scsi: qla2xxx: Handle sts_cont_entry_ext_t for 29xx adapters Nilesh Javali
2026-06-12 10:54   ` sashiko-bot
2026-06-12 11:47   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 29/60] scsi: qla2xxx: Update handling of status entries for 29xx series Nilesh Javali
2026-06-12 10:44   ` sashiko-bot
2026-06-12 12:12   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 30/60] scsi: qla2xxx: Enhance ct_entry_24xx_ext iocb handling " Nilesh Javali
2026-06-12 12:14   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 31/60] scsi: qla2xxx: Enhance purex_entry " Nilesh Javali
2026-06-12 10:54   ` sashiko-bot
2026-06-12 12:16   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 32/60] scsi: qla2xxx: Update handling of ELS IOCBs " Nilesh Javali
2026-06-12 12:33   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 33/60] scsi: qla2xxx: Add size check for ELS status entry layout on 29xx Nilesh Javali
2026-06-12 12:34   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 34/60] scsi: qla2xxx: Add 29xx extended logio IOCB support Nilesh Javali
2026-06-12 12:36   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 35/60] scsi: qla2xxx: Enhance task management IOCB handling for 29xx series Nilesh Javali
2026-06-12 11:13   ` sashiko-bot
2026-06-12 12:37   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 36/60] scsi: qla2xxx: Add abort command " Nilesh Javali
2026-06-12 11:15   ` sashiko-bot
2026-06-12 12:38   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 37/60] scsi: qla2xxx: Enhance ABTS processing " Nilesh Javali
2026-06-12 12:41   ` Hannes Reinecke
2026-06-12 15:12   ` sashiko-bot
2026-06-12  9:53 ` [PATCH v2 38/60] scsi: qla2xxx: Update VP control IOCB handling " Nilesh Javali
2026-06-12 12:45   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 39/60] scsi: qla2xxx: Add build-time size check for VP config IOCB layout Nilesh Javali
2026-06-12 12:45   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 40/60] scsi: qla2xxx: Add size check for extended VP report ID entry Nilesh Javali
2026-06-12 11:05   ` sashiko-bot
2026-06-12 12:46   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 41/60] scsi: qla2xxx: Unify NVMe IOCB build path for 29xx and legacy adapters Nilesh Javali
2026-06-12 11:02   ` sashiko-bot
2026-06-12 12:49   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 42/60] scsi: qla2xxx: Add LS4 pass-through IOCB handling for 29xx series Nilesh Javali
2026-06-12 12:50   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 43/60] scsi: qla2xxx: Convert NVMe ring advance to use qla_req_ring_advance() Nilesh Javali
2026-06-12 12:52   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 44/60] scsi: qla2xxx: Adjust feature gating in BSG paths for 29xx support Nilesh Javali
2026-06-12 11:16   ` sashiko-bot
2026-06-12 12:53   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 45/60] scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking Nilesh Javali
2026-06-12 12:56   ` Hannes Reinecke
2026-06-12 13:23   ` sashiko-bot
2026-06-12  9:53 ` [PATCH v2 46/60] scsi: qla2xxx: Replace __le16 bitfields with scalar and accessors Nilesh Javali
2026-06-12 12:57   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 47/60] scsi: qla2xxx: Fix endianness annotations in vp_rpt_id_entry structures Nilesh Javali
2026-06-12 12:59   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 48/60] scsi: qla2xxx: Use 64-bit FPM word counters for 29xx host stats Nilesh Javali
2026-06-12 13:00   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 49/60] scsi: qla2xxx: Add 64G/128G port speed setting support Nilesh Javali
2026-06-12 13:02   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 50/60] scsi: qla2xxx: Fix 64G link speed reporting in get_data_rate Nilesh Javali
2026-06-12 13:03   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 51/60] scsi: qla2xxx: edif: Fix NULL pointer deref in RX SA delete check Nilesh Javali
2026-06-12 11:43   ` sashiko-bot
2026-06-12 13:04   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 52/60] scsi: qla2xxx: Fix Name Server logout detection on FWI2 adapters Nilesh Javali
2026-06-12 13:08   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 53/60] scsi: qla2xxx: Bound VP index against VP_CTRL IOCB bitmap size Nilesh Javali
2026-06-12 11:35   ` sashiko-bot
2026-06-12 13:09   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 54/60] scsi: qla2xxx: Check entry_status in qla24xx_modify_vp_config() Nilesh Javali
2026-06-12 13:10   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 55/60] scsi: qla2xxx: Hold vport reference in qla24xx_report_id_acquisition() Nilesh Javali
2026-06-12 11:38   ` sashiko-bot
2026-06-12 13:10   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 56/60] scsi: qla2xxx: Initialize NVMe abort_work once at submission Nilesh Javali
2026-06-12 11:34   ` sashiko-bot
2026-06-12 13:11   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 57/60] scsi: qla2xxx: Hold qpair lock when sending NVMe LS reject Nilesh Javali
2026-06-12 11:39   ` sashiko-bot
2026-06-12 13:11   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 58/60] scsi: qla2xxx: Zero dport diagnostics buffer to avoid info leak Nilesh Javali
2026-06-12 11:40   ` sashiko-bot
2026-06-12 13:12   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 59/60] scsi: qla2xxx: Fix BSG job leak on validate flash image error path Nilesh Javali
2026-06-12 11:38   ` sashiko-bot
2026-06-12 13:12   ` Hannes Reinecke
2026-06-12  9:53 ` [PATCH v2 60/60] scsi: qla2xxx: Bound image count in qla2x00_update_fru_versions() Nilesh Javali
2026-06-12 11:45   ` sashiko-bot
2026-06-12 13:13   ` Hannes Reinecke

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=20260612101419.69D491F00A3A@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=njavali@marvell.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.