| From 0a16522f680a1e81bd2b7356035314cf99aae7a2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 25 Feb 2023 18:01:36 +0800 |
| Subject: scsi: mpt3sas: Fix NULL pointer access in |
| mpt3sas_transport_port_add() |
| |
| From: Wenchao Hao <haowenchao2@huawei.com> |
| |
| [ Upstream commit d3c57724f1569311e4b81e98fad0931028b9bdcd ] |
| |
| Port is allocated by sas_port_alloc_num() and rphy is allocated by either |
| sas_end_device_alloc() or sas_expander_alloc(), all of which may return |
| NULL. So we need to check the rphy to avoid possible NULL pointer access. |
| |
| If sas_rphy_add() returned with failure, rphy is set to NULL. We would |
| access the rphy in the following lines which would also result NULL pointer |
| access. |
| |
| Fixes: 78316e9dfc24 ("scsi: mpt3sas: Fix possible resource leaks in mpt3sas_transport_port_add()") |
| Signed-off-by: Wenchao Hao <haowenchao2@huawei.com> |
| Link: https://lore.kernel.org/r/20230225100135.2109330-1-haowenchao2@huawei.com |
| Acked-by: Sathya Prakash Veerichetty <sathya.prakash@broadcom.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/mpt3sas/mpt3sas_transport.c | 14 ++++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c b/drivers/scsi/mpt3sas/mpt3sas_transport.c |
| index b58f4d9c296a3..326265fd7f91a 100644 |
| --- a/drivers/scsi/mpt3sas/mpt3sas_transport.c |
| +++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c |
| @@ -670,7 +670,7 @@ mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc, u16 handle, |
| goto out_fail; |
| } |
| port = sas_port_alloc_num(sas_node->parent_dev); |
| - if ((sas_port_add(port))) { |
| + if (!port || (sas_port_add(port))) { |
| ioc_err(ioc, "failure at %s:%d/%s()!\n", |
| __FILE__, __LINE__, __func__); |
| goto out_fail; |
| @@ -695,6 +695,12 @@ mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc, u16 handle, |
| rphy = sas_expander_alloc(port, |
| mpt3sas_port->remote_identify.device_type); |
| |
| + if (!rphy) { |
| + ioc_err(ioc, "failure at %s:%d/%s()!\n", |
| + __FILE__, __LINE__, __func__); |
| + goto out_delete_port; |
| + } |
| + |
| rphy->identify = mpt3sas_port->remote_identify; |
| |
| if (mpt3sas_port->remote_identify.device_type == SAS_END_DEVICE) { |
| @@ -714,6 +720,7 @@ mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc, u16 handle, |
| __FILE__, __LINE__, __func__); |
| sas_rphy_free(rphy); |
| rphy = NULL; |
| + goto out_delete_port; |
| } |
| |
| if (mpt3sas_port->remote_identify.device_type == SAS_END_DEVICE) { |
| @@ -740,7 +747,10 @@ mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc, u16 handle, |
| rphy_to_expander_device(rphy)); |
| return mpt3sas_port; |
| |
| - out_fail: |
| +out_delete_port: |
| + sas_port_delete(port); |
| + |
| +out_fail: |
| list_for_each_entry_safe(mpt3sas_phy, next, &mpt3sas_port->phy_list, |
| port_siblings) |
| list_del(&mpt3sas_phy->port_siblings); |
| -- |
| 2.39.2 |
| |