VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-45872

CVE-2026-45872

Description

In the Linux kernel, the following vulnerability has been resolved:

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

pqi_report_phys_luns() fails to release the rpl_list buffer when encountering an unsupported data format or when the allocation for rpl_16byte_wwid_list fails. These early returns bypass the cleanup logic, leading to memory leaks.

Consolidate the error handling by adding an out_free_rpl_list label and use goto statements to ensure rpl_list is consistently freed on failure.

Compile tested only. Issue found using a prototype static analysis tool and code review.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

A memory leak in the Linux kernel's smartpqi driver can occur in pqi_report_phys_luns() when early returns bypass cleanup for the rpl_list buffer.

Vulnerability

A memory leak vulnerability exists in the Linux kernel's smartpqi SCSI driver, within the function pqi_report_phys_luns(). When encountering an unsupported data format or if allocation for rpl_16byte_wwid_list fails, the function returns early without freeing the previously allocated rpl_list buffer. This affects kernel versions with the smartpqi driver before the fix (commit 454570434114). The issue was identified via static analysis and code review [1].

Exploitation

An attacker does not need an explicit exploit scenario for a memory leak of this kind. The vulnerability is triggered naturally during normal operation when the driver processes a REPORT LUNS response with an unsupported data format, or when memory allocation for extended WWID lists is insufficient. No special privileges or user interaction are required beyond the ability to present such a response to the system (e.g., via a malicious SCSI device) or causing memory pressure that leads to allocation failures [1].

Impact

Repeated triggering of the error paths results in cumulative memory leaks, depleting kernel memory over time. This could lead to system instability, denial-of-service (DoS), or resource exhaustion on systems using smartpqi controllers. There is no information disclosure or privilege escalation directly; the primary impact is availability [1].

Mitigation

The fix (commit 454570434114) consolidates error handling by adding an out_free_rpl_list label and using goto to ensure rpl_list is always freed on failure. Updating to a kernel containing this commit resolves the vulnerability. No workaround is documented; users should apply the kernel patch. The issue was published on 2026-05-27 [1].

AI Insight generated on May 27, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

1

Patches

12
e5579ebaadc7

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 31, 2026Fixed in 6.18.14via kernel-cna
1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 98e93900254cb2..5a6e1bb57e7c84 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1241,7 +1241,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1253,8 +1254,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1275,6 +1278,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
f471ecfec093

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 31, 2026Fixed in 6.1.165via kernel-cna
1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 5c0f23dd808c49..5dd116554ef62e 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1213,7 +1213,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1225,8 +1226,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1247,6 +1250,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
fdf1188cfa80

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 31, 2026Fixed in 6.6.128via kernel-cna
1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 0cdeb7aa550203..dc194c76f38b7c 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1240,7 +1240,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1252,8 +1253,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1274,6 +1277,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
d52e13122d37

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 31, 2026Fixed in 6.12.75via kernel-cna
1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index f0fb22e4117eb9..e7836f66c89adf 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1239,7 +1239,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1251,8 +1252,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1273,6 +1276,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
454570434114

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 31, 2026Fixed in 6.19.4via kernel-cna
1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index fe549e2b7c9407..c829d9590558df 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1241,7 +1241,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1253,8 +1254,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1275,6 +1278,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
41b37312bd97

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 31, 2026Fixed in 7.0via kernel-cna
1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 36834768fec1ce..6f859f0d204605 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1241,7 +1241,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1253,8 +1254,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1275,6 +1278,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
41b37312bd97

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 36834768fec1ce..6f859f0d204605 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1241,7 +1241,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1253,8 +1254,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1275,6 +1278,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
e5579ebaadc7

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 98e93900254cb2..5a6e1bb57e7c84 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1241,7 +1241,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1253,8 +1254,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1275,6 +1278,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
454570434114

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index fe549e2b7c9407..c829d9590558df 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1241,7 +1241,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1253,8 +1254,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1275,6 +1278,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
f471ecfec093

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 5c0f23dd808c49..5dd116554ef62e 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1213,7 +1213,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1225,8 +1226,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1247,6 +1250,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
d52e13122d37

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index f0fb22e4117eb9..e7836f66c89adf 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1239,7 +1239,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1251,8 +1252,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1273,6 +1276,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    
fdf1188cfa80

scsi: smartpqi: Fix memory leak in pqi_report_phys_luns()

1 file changed · +10 4
  • drivers/scsi/smartpqi/smartpqi_init.c+10 4 modified
    diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
    index 0cdeb7aa550203..dc194c76f38b7c 100644
    --- a/drivers/scsi/smartpqi/smartpqi_init.c
    +++ b/drivers/scsi/smartpqi/smartpqi_init.c
    @@ -1240,7 +1240,8 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     			dev_err(&ctrl_info->pci_dev->dev,
     				"RPL returned unsupported data format %u\n",
     				rpl_response_format);
    -			return -EINVAL;
    +			rc = -EINVAL;
    +			goto out_free_rpl_list;
     		} else {
     			dev_warn(&ctrl_info->pci_dev->dev,
     				"RPL returned extended format 2 instead of 4\n");
    @@ -1252,8 +1253,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     
     	rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
     						   num_physicals), GFP_KERNEL);
    -	if (!rpl_16byte_wwid_list)
    -		return -ENOMEM;
    +	if (!rpl_16byte_wwid_list) {
    +		rc = -ENOMEM;
    +		goto out_free_rpl_list;
    +	}
     
     	put_unaligned_be32(num_physicals * sizeof(struct report_phys_lun_16byte_wwid),
     		&rpl_16byte_wwid_list->header.list_length);
    @@ -1274,6 +1277,10 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
     	*buffer = rpl_16byte_wwid_list;
     
     	return 0;
    +
    +out_free_rpl_list:
    +	kfree(rpl_list);
    +	return rc;
     }
     
     static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info, void **buffer)
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing deallocation of the rpl_list buffer on two early-return error paths in pqi_report_phys_luns()."

Attack vector

An attacker who can cause the smartpqi driver to process a Report Physical LUNs (RPL) response with an unsupported data format, or who can trigger a memory-allocation failure for the `rpl_16byte_wwid_list` buffer, will cause the `rpl_list` buffer to be leaked. The leak occurs because the original code used bare `return -EINVAL` and `return -ENOMEM` statements that skipped the cleanup of `rpl_list`. No authentication or special privileges are required beyond the ability to interact with the SCSI subsystem in a way that produces these conditions.

Affected code

The vulnerability resides in the `pqi_report_phys_luns()` function in `drivers/scsi/smartpqi/smartpqi_init.c` [patch_id=2661834]. Two early-return paths — one for an unsupported RPL data format and one for a failed `kmalloc` of `rpl_16byte_wwid_list` — returned directly without freeing the previously allocated `rpl_list` buffer.

What the fix does

The patch replaces the two direct `return` statements with `rc = -EINVAL; goto out_free_rpl_list;` and `rc = -ENOMEM; goto out_free_rpl_list;`, and adds an `out_free_rpl_list:` label that calls `kfree(rpl_list)` before returning `rc` [patch_id=2661837]. This ensures that `rpl_list` is always freed on the error paths, closing the memory leak. The normal success path (which transfers ownership of `rpl_list` into `rpl_16byte_wwid_list`) is unchanged.

Preconditions

  • configThe smartpqi driver must be in use and processing a Report Physical LUNs response.
  • inputThe RPL response must contain an unsupported data format, or memory allocation for rpl_16byte_wwid_list must fail.

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

6

News mentions

0

No linked articles in our index yet.