2023-03-25 03:04:12

by Li Zetao

[permalink] [raw]
Subject: [PATCH] scsi: qla2xxx: Fix memory leak in qla2x00_probe_one()

There is a memory leak reported by kmemleak:

unreferenced object 0xffffc900003f0000 (size 12288):
comm "modprobe", pid 19117, jiffies 4299751452 (age 42490.264s)
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<00000000629261a8>] __vmalloc_node_range+0xe56/0x1110
[<0000000001906886>] __vmalloc_node+0xbd/0x150
[<000000005bb4dc34>] vmalloc+0x25/0x30
[<00000000a2dc1194>] qla2x00_create_host+0x7a0/0xe30 [qla2xxx]
[<0000000062b14b47>] qla2x00_probe_one+0x2eb8/0xd160 [qla2xxx]
[<00000000641ccc04>] local_pci_probe+0xeb/0x1a0

The root cause is traced to an error handling path in qla2x00_probe_one()
when the adapter "base_vha" initialize failed. The fab_scan_rp "scan.l"
is used to record the port information and it is alloced in
qla2x00_create_host(). However, it is not released in the error handling
path "probe_failed".

Fix it by freeing the memory of "scan.l" when an error occurs in adapter
initialize process.

Fixes: a4239945b8ad ("scsi: qla2xxx: Add switch command to simplify fabric discovery")
Signed-off-by: Li Zetao <[email protected]>
---
drivers/scsi/qla2xxx/qla_os.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 80c4ee9df2a4..38916e11684d 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -3606,6 +3606,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
probe_failed:
qla_enode_stop(base_vha);
qla_edb_stop(base_vha);
+ vfree(base_vha->scan.l);
if (base_vha->gnl.l) {
dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size,
base_vha->gnl.l, base_vha->gnl.ldma);
--
2.34.1


2023-03-27 18:16:40

by Himanshu Madhani

[permalink] [raw]
Subject: Re: [PATCH] scsi: qla2xxx: Fix memory leak in qla2x00_probe_one()



> On Mar 25, 2023, at 4:00 AM, Li Zetao <[email protected]> wrote:
>
> There is a memory leak reported by kmemleak:
>
> unreferenced object 0xffffc900003f0000 (size 12288):
> comm "modprobe", pid 19117, jiffies 4299751452 (age 42490.264s)
> hex dump (first 32 bytes):
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
> backtrace:
> [<00000000629261a8>] __vmalloc_node_range+0xe56/0x1110
> [<0000000001906886>] __vmalloc_node+0xbd/0x150
> [<000000005bb4dc34>] vmalloc+0x25/0x30
> [<00000000a2dc1194>] qla2x00_create_host+0x7a0/0xe30 [qla2xxx]
> [<0000000062b14b47>] qla2x00_probe_one+0x2eb8/0xd160 [qla2xxx]
> [<00000000641ccc04>] local_pci_probe+0xeb/0x1a0
>
> The root cause is traced to an error handling path in qla2x00_probe_one()
> when the adapter "base_vha" initialize failed. The fab_scan_rp "scan.l"
> is used to record the port information and it is alloced in
> qla2x00_create_host(). However, it is not released in the error handling
> path "probe_failed".
>
> Fix it by freeing the memory of "scan.l" when an error occurs in adapter
> initialize process.
>
> Fixes: a4239945b8ad ("scsi: qla2xxx: Add switch command to simplify fabric discovery")
> Signed-off-by: Li Zetao <[email protected]>
> ---
> drivers/scsi/qla2xxx/qla_os.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
> index 80c4ee9df2a4..38916e11684d 100644
> --- a/drivers/scsi/qla2xxx/qla_os.c
> +++ b/drivers/scsi/qla2xxx/qla_os.c
> @@ -3606,6 +3606,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
> probe_failed:
> qla_enode_stop(base_vha);
> qla_edb_stop(base_vha);
> + vfree(base_vha->scan.l);
> if (base_vha->gnl.l) {
> dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size,
> base_vha->gnl.l, base_vha->gnl.ldma);
> --
> 2.34.1
>

Reviewed-by: Himanshu Madhani <[email protected]>

--
Himanshu Madhani Oracle Linux Engineering

2023-04-03 02:25:04

by Martin K. Petersen

[permalink] [raw]
Subject: Re: [PATCH] scsi: qla2xxx: Fix memory leak in qla2x00_probe_one()

On Sat, 25 Mar 2023 11:00:04 +0000, Li Zetao wrote:

> There is a memory leak reported by kmemleak:
>
> unreferenced object 0xffffc900003f0000 (size 12288):
> comm "modprobe", pid 19117, jiffies 4299751452 (age 42490.264s)
> hex dump (first 32 bytes):
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
> backtrace:
> [<00000000629261a8>] __vmalloc_node_range+0xe56/0x1110
> [<0000000001906886>] __vmalloc_node+0xbd/0x150
> [<000000005bb4dc34>] vmalloc+0x25/0x30
> [<00000000a2dc1194>] qla2x00_create_host+0x7a0/0xe30 [qla2xxx]
> [<0000000062b14b47>] qla2x00_probe_one+0x2eb8/0xd160 [qla2xxx]
> [<00000000641ccc04>] local_pci_probe+0xeb/0x1a0
>
> [...]

Applied to 6.3/scsi-fixes, thanks!

[1/1] scsi: qla2xxx: Fix memory leak in qla2x00_probe_one()
https://git.kernel.org/mkp/scsi/c/85ade4010e13

--
Martin K. Petersen Oracle Linux Engineering