scsi: mpi3mr: Bad drive in topology results kernel crash
[ Upstream commit 8e45183978d64699df639e795235433a60f35047 ] When the SAS Transport Layer support is enabled and a device exposed to the OS by the driver fails INQUIRY commands, the driver frees up the memory allocated for an internal HBA port data structure. However, in some places, the reference to the freed memory is not cleared. When the firmware sends the Device Info change event for the same device again, the freed memory is accessed and that leads to memory corruption and OS crash. Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com> Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com> Link: https://lore.kernel.org/r/20230228140835.4075-7-ranjan.kumar@broadcom.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
a0b33e1d8d
commit
1f822ae8fb
@ -2355,15 +2355,16 @@ int mpi3mr_report_tgtdev_to_sas_transport(struct mpi3mr_ioc *mrioc,
|
||||
tgtdev->host_exposed = 1;
|
||||
if (!mpi3mr_sas_port_add(mrioc, tgtdev->dev_handle,
|
||||
sas_address_parent, hba_port)) {
|
||||
tgtdev->host_exposed = 0;
|
||||
retval = -1;
|
||||
} else if ((!tgtdev->starget)) {
|
||||
if (!mrioc->is_driver_loading)
|
||||
} else if ((!tgtdev->starget) && (!mrioc->is_driver_loading)) {
|
||||
mpi3mr_sas_port_remove(mrioc, sas_address,
|
||||
sas_address_parent, hba_port);
|
||||
tgtdev->host_exposed = 0;
|
||||
retval = -1;
|
||||
}
|
||||
if (retval) {
|
||||
tgtdev->dev_spec.sas_sata_inf.hba_port = NULL;
|
||||
tgtdev->host_exposed = 0;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -2392,6 +2393,7 @@ void mpi3mr_remove_tgtdev_from_sas_transport(struct mpi3mr_ioc *mrioc,
|
||||
mpi3mr_sas_port_remove(mrioc, sas_address, sas_address_parent,
|
||||
hba_port);
|
||||
tgtdev->host_exposed = 0;
|
||||
tgtdev->dev_spec.sas_sata_inf.hba_port = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2448,7 +2450,7 @@ static u8 mpi3mr_get_port_id_by_rphy(struct mpi3mr_ioc *mrioc, struct sas_rphy *
|
||||
|
||||
tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
|
||||
rphy->identify.sas_address, rphy);
|
||||
if (tgtdev) {
|
||||
if (tgtdev && tgtdev->dev_spec.sas_sata_inf.hba_port) {
|
||||
port_id =
|
||||
tgtdev->dev_spec.sas_sata_inf.hba_port->port_id;
|
||||
mpi3mr_tgtdev_put(tgtdev);
|
||||
|
Loading…
Reference in New Issue
Block a user