FAILED: patch "[PATCH] scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc()" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 6d90f0feb929f6c0f3010f9af4747c7230b75993
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090900-plot-uninvited-75a9@gregkh' --subject-prefix 'PATCH 5.15.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6d90f0feb929f6c0f3010f9af4747c7230b75993 Mon Sep 17 00:00:00 2001
From: Nilesh Javali <[email protected]>
Date: Thu, 30 Jul 2026 21:28:17 +0530
Subject: [PATCH] scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc()
error path
When qla2x00_mem_alloc() fails, qla2x00_probe_one() jumps to probe_hw_failed and calls qla2x00_mem_free(). Several error labels in qla2x00_mem_alloc() freed adapter members (elsrej.c, purex_dma_pool, flt, sfp_data, loop_id_map, async_pd, sf_init_cb, ex_init_cb, npiv_info) but left the pointers dangling. qla2x00_mem_free() then freed them a second time. Worse, for the dma_pool members it issued dma_pool_free(ha->s_dma_pool, ...) after s_dma_pool had already been destroyed and set to NULL at fail_s_dma_pool, dereferencing a NULL pool.
Clear each freed pointer (and its DMA handle) in the error labels so the subsequent qla2x00_mem_free() skips them.
drivers/scsi/qla2xxx/qla_os.c +15 -0
@@ -4619,28 +4619,43 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, fail_lsrjt:dma_free_coherent (&ha->pdev->dev, ha->elsrej.size, ha->elsrej.c, ha->elsrej.cdma); + ha->elsrej.c =NULL ; + ha->elsrej.cdma =0 ; fail_elsrej:dma_pool_destroy (ha->purex_dma_pool); + ha->purex_dma_pool =NULL ; fail_flt_data:vfree (ha->flt_data); ha->flt_data =NULL ; fail_flt:dma_free_coherent (&ha->pdev->dev,sizeof (struct qla_flt_header ) +FLT_REGIONS_SIZE , ha->flt, ha->flt_dma); + ha->flt =NULL ; + ha->flt_dma =0 ; fail_flt_buffer:dma_free_coherent (&ha->pdev->dev,SFP_DEV_SIZE , ha->sfp_data, ha->sfp_data_dma); + ha->sfp_data =NULL ; + ha->sfp_data_dma =0 ; fail_sfp_data:kfree (ha->loop_id_map); + ha->loop_id_map =NULL ; fail_loop_id_map:dma_pool_free (ha->s_dma_pool, ha->async_pd, ha->async_pd_dma); + ha->async_pd =NULL ; + ha->async_pd_dma =0 ; fail_async_pd:dma_pool_free (ha->s_dma_pool, ha->sf_init_cb, ha->sf_init_cb_dma); + ha->sf_init_cb =NULL ; + ha->sf_init_cb_dma =0 ; fail_sf_init_cb:dma_pool_free (ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma); + ha->ex_init_cb =NULL ; + ha->ex_init_cb_dma =0 ; fail_ex_init_cb:kfree (ha->npiv_info); + ha->npiv_info =NULL ; fail_npiv_info: dma_free_coherent(&ha->pdev->dev, ((*rsp)->length + 1) * rsp_entry_size,
Sasha Levin
maintainerPATCH 1/1 scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc() error path
From: Nilesh Javali <[email protected]>
[ Upstream commit 6d90f0feb929f6c0f3010f9af4747c7230b75993 ]
When qla2x00_mem_alloc() fails, qla2x00_probe_one() jumps to probe_hw_failed and calls qla2x00_mem_free(). Several error labels in qla2x00_mem_alloc() freed adapter members (elsrej.c, purex_dma_pool, flt, sfp_data, loop_id_map, async_pd, sf_init_cb, ex_init_cb, npiv_info) but left the pointers dangling. qla2x00_mem_free() then freed them a second time. Worse, for the dma_pool members it issued dma_pool_free(ha->s_dma_pool, ...) after s_dma_pool had already been destroyed and set to NULL at fail_s_dma_pool, dereferencing a NULL pool.
Clear each freed pointer (and its DMA handle) in the error labels so the subsequent qla2x00_mem_free() skips them.
--- drivers/scsi/qla2xxx/qla_os.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/scsi/qla2xxx/qla_os.c +13 -0
@@ -4431,23 +4431,36 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, fail_elsrej:dma_pool_destroy (ha->purex_dma_pool); + ha->purex_dma_pool =NULL ; fail_flt:dma_free_coherent (&ha->pdev->dev,sizeof (struct qla_flt_header ) +FLT_REGIONS_SIZE , ha->flt, ha->flt_dma); + ha->flt =NULL ; + ha->flt_dma =0 ; fail_flt_buffer:dma_free_coherent (&ha->pdev->dev,SFP_DEV_SIZE , ha->sfp_data, ha->sfp_data_dma); + ha->sfp_data =NULL ; + ha->sfp_data_dma =0 ; fail_sfp_data:kfree (ha->loop_id_map); + ha->loop_id_map =NULL ; fail_loop_id_map:dma_pool_free (ha->s_dma_pool, ha->async_pd, ha->async_pd_dma); + ha->async_pd =NULL ; + ha->async_pd_dma =0 ; fail_async_pd:dma_pool_free (ha->s_dma_pool, ha->sf_init_cb, ha->sf_init_cb_dma); + ha->sf_init_cb =NULL ; + ha->sf_init_cb_dma =0 ; fail_sf_init_cb:dma_pool_free (ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma); + ha->ex_init_cb =NULL ; + ha->ex_init_cb_dma =0 ; fail_ex_init_cb:kfree (ha->npiv_info); + ha->npiv_info =NULL ; fail_npiv_info:dma_free_coherent (&ha->pdev->dev, ((*rsp)->length +1 ) *sizeof (response_t), (*rsp)->ring, (*rsp)->dma);
Signature · 1 line
2.53.0