Linux SCSI subsystem development
 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 v4 40/56] scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking
Date: Tue, 14 Jul 2026 16:02:57 +0000	[thread overview]
Message-ID: <20260714160258.0E1921F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260714095353.289460-41-njavali@marvell.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:

Pre-existing issues:
- [High] Missing cancellation of `qpair->q_work` during queue pair teardown leads to Use-After-Free of `qpair`.
- [High] DMA memory for queues is freed before safely clearing the queue pointers, leading to a race condition and Use-After-Free by concurrent readers like firmware dump.
- [High] Hardware-supplied queue indices are used to index `ha->req_q_map` prior to bounds validation, leading to Out-of-Bounds Read.
- [Medium] Host memory and DMA mappings are leaked during teardown if queues were allocated but not started in hardware.
--

--- Patch [40]: [PATCH v4 40/56] scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking ---
commit 00cbb695fac148d9ec27ea62ef3a784eac6e57fb
Author: Nilesh Javali <njavali@marvell.com>

scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking

This patch fixes a potential panic when freeing uninitialized DMA memory on
error paths. It also adds locking to prevent concurrent queue ID allocation
races.

> diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c
> index bb2521c052bf8..7072af5b42178 100644
> --- a/drivers/scsi/qla2xxx/qla_mid.c
> +++ b/drivers/scsi/qla2xxx/qla_mid.c
> @@ -576,16 +576,17 @@ qla25xx_free_req_que(struct scsi_qla_host *vha, struct req_que *req)
>  	uint16_t que_id = req->id;
>  	size_t req_entry_size = qla_req_entry_size(ha);
>  
> -	dma_free_coherent(&ha->pdev->dev,
> -			  (req->length + 1) * req_entry_size,
> -			  req->ring, req->dma);
> +	if (req->ring)
> +		dma_free_coherent(&ha->pdev->dev,
> +				  (req->length + 1) * req_entry_size,
> +				  req->ring, req->dma);

[Severity: High]
This is a pre-existing issue, but does freeing the DMA memory here before
clearing the queue pointer create a race condition?

If a firmware dump occurs concurrently (e.g., triggered by a mailbox timeout),
it executes qla27xx_fwdt_entry_t263() under hardware_lock and reads
from ha->req_q_map[i]. It could then copy from req->ring via
qla27xx_insertbuf() after the memory has been freed here.

Would it be safer to nullify ha->req_q_map[que_id] before calling
dma_free_coherent()?

>  	req->ring = NULL;
>  	req->dma = 0;
>  	if (que_id) {
> +		mutex_lock(&ha->mq_lock);
>  		ha->req_q_map[que_id] = NULL;
> -		mutex_lock(&ha->vport_lock);
>  		clear_bit(que_id, ha->req_qid_map);
> -		mutex_unlock(&ha->vport_lock);
> +		mutex_unlock(&ha->mq_lock);
>  	}
>  	kfree(req->outstanding_cmds);
>  	kfree(req);

[ ... ]

> @@ -605,16 +606,17 @@ qla25xx_free_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
>  		rsp->msix->handle = NULL;
>  	}

[Severity: High]
This isn't a bug introduced by this patch, but is it possible for a pending
work item to execute after the qpair is destroyed?

The interrupt handler qla2xxx_msix_rsp_q() queues qpair->q_work on the
workqueue. During teardown, we free the IRQ here, but the already-queued
work doesn't appear to be flushed or cancelled before qla2xxx_delete_qpair()
frees the qpair structure.

When the work eventually executes, qla_do_work() resolves the qpair:

qla_do_work() {
    struct qla_qpair *qpair = container_of(work, struct qla_qpair, q_work);
    ...
}

Could this lead to a use-after-free if the work runs after the qpair is
freed?

> -	dma_free_coherent(&ha->pdev->dev,
> -			  (rsp->length + 1) * rsp_entry_size,
> -			  rsp->ring, rsp->dma);
> +	if (rsp->ring)
> +		dma_free_coherent(&ha->pdev->dev,
> +				  (rsp->length + 1) * rsp_entry_size,
> +				  rsp->ring, rsp->dma);

[ ... ]

While reviewing the queue teardown paths, I also noticed a few other
pre-existing issues in the driver:

[Severity: Medium]
This is a pre-existing issue, but does qla25xx_delete_req_que() leak memory
if the queues were allocated but never started?

In qla25xx_delete_req_que():

qla25xx_delete_req_que() {
    ...
    if (req && vha->flags.qpairs_req_created) {
        req->options |= BIT_0;
        ret = qla25xx_init_req_que(vha, req);
        if (ret != QLA_SUCCESS)
            return QLA_FUNCTION_FAILED;

        qla25xx_free_req_que(vha, req);
    }
}

If qpairs_req_created is false (such as during a driver initialization
failure or if startqp was false), the check fails and we never call
qla25xx_free_req_que(), which appears to leak the req structure and its DMA
mappings.

[Severity: High]
This is a pre-existing issue, but is it safe to use the hardware-supplied
queue index before validating it?

In qla2x00_status_entry(), the hardware returns sts->handle which is
used to look up the queue:

qla2x00_status_entry() {
    ...
    que = MSW(sts->handle);
    req = ha->req_q_map[que];

    /* Check for invalid queue pointer */
    if (req == NULL ||
        que >= find_first_zero_bit(ha->req_qid_map, ha->max_req_queues)) {
        ...
}

The index que is used to access ha->req_q_map before checking if it is
within bounds. A similar pattern exists in qlafx00_status_entry() where
req is dereferenced before validation. Could a corrupted handle from
the firmware cause an out-of-bounds read here?

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

  reply	other threads:[~2026-07-14 16:02 UTC|newest]

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