diff options
| author | nagalakshmi.nandigama@lsi.com <nagalakshmi.nandigama@lsi.com> | 2012-03-20 12:10:01 +0530 | 
|---|---|---|
| committer | James Bottomley <JBottomley@Parallels.com> | 2012-04-23 19:27:50 +0100 | 
| commit | e42fafc25fa86c61824e8d4c5e7582316415d24f (patch) | |
| tree | 835e4e9d649f5853606dbdd3a2f804f83d77c8f1 | |
| parent | 39af7a98946a73f2e4bfb35cfbca2114366d0c82 (diff) | |
| download | olio-linux-3.10-e42fafc25fa86c61824e8d4c5e7582316415d24f.tar.xz olio-linux-3.10-e42fafc25fa86c61824e8d4c5e7582316415d24f.zip  | |
[SCSI] mpt2sas: Fix for panic happening because of improper memory allocation
The ioc->pfacts member in the IOC structure is getting set to zero
following a call to _base_get_ioc_facts due to the memset in that routine.
So if the ioc->pfacts was read after a host reset, there would be a NULL
pointer dereference. The routine _base_get_ioc_facts is called from context
of host reset.  The problem in _base_get_ioc_facts  is the size of
Mpi2IOCFactsReply is 64, whereas the sizeof "struct mpt2sas_facts" is 60,
so there is a four byte overflow resulting from the memset.
Also, there is memset in _base_get_port_facts using the incorrect structure,
it should be "struct mpt2sas_port_facts" instead of Mpi2PortFactsReply.
Signed-off-by: Nagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com>
CC: stable@vger.kernel.org
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 6 | 
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 702faf67710..6102ef2cb2d 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c @@ -3350,7 +3350,7 @@ _base_get_port_facts(struct MPT2SAS_ADAPTER *ioc, int port, int sleep_flag)  	}  	pfacts = &ioc->pfacts[port]; -	memset(pfacts, 0, sizeof(Mpi2PortFactsReply_t)); +	memset(pfacts, 0, sizeof(struct mpt2sas_port_facts));  	pfacts->PortNumber = mpi_reply.PortNumber;  	pfacts->VP_ID = mpi_reply.VP_ID;  	pfacts->VF_ID = mpi_reply.VF_ID; @@ -3392,7 +3392,7 @@ _base_get_ioc_facts(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)  	}  	facts = &ioc->facts; -	memset(facts, 0, sizeof(Mpi2IOCFactsReply_t)); +	memset(facts, 0, sizeof(struct mpt2sas_facts));  	facts->MsgVersion = le16_to_cpu(mpi_reply.MsgVersion);  	facts->HeaderVersion = le16_to_cpu(mpi_reply.HeaderVersion);  	facts->VP_ID = mpi_reply.VP_ID; @@ -4270,7 +4270,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)  		goto out_free_resources;  	ioc->pfacts = kcalloc(ioc->facts.NumberOfPorts, -	    sizeof(Mpi2PortFactsReply_t), GFP_KERNEL); +	    sizeof(struct mpt2sas_port_facts), GFP_KERNEL);  	if (!ioc->pfacts) {  		r = -ENOMEM;  		goto out_free_resources;  |