aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/mpt2sas/mpt2sas_scsih.c
diff options
context:
space:
mode:
authorSreekanth Reddy <Sreekanth.Reddy@lsi.com>2013-07-25 01:54:35 -0400
committerJames Bottomley <JBottomley@Parallels.com>2013-09-03 10:27:50 -0400
commit6409a7d000020ffdd61082af8bb24291d2cdc1a6 (patch)
treefa4b48400632251539614715ba356ff6e086fa70 /drivers/scsi/mpt2sas/mpt2sas_scsih.c
parent804a5cb526c121226830c686132b1b82aa12b76c (diff)
[SCSI] mpt2sas: Null pointer deference possibility in mpt2sas_ctl_event_callback function
Added a check to identify if mpi_reply is NULL in mpt2sas_ctl_event_callback() and return without proceeding if it is the case. Also modified the following functions to return void instead of 0 or 1 as returning those values from events perspective doesn't make sense. * _base_async_event() * mpt2sas_ctl_event_callback() * mpt2sas_scsih_event_callback() Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@lsi.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_scsih.c')
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index 389d79290861..2dbd2262f3d5 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -7471,10 +7471,9 @@ _firmware_event_work(struct work_struct *work)
7471 * This function merely adds a new work task into ioc->firmware_event_thread. 7471 * This function merely adds a new work task into ioc->firmware_event_thread.
7472 * The tasks are worked from _firmware_event_work in user context. 7472 * The tasks are worked from _firmware_event_work in user context.
7473 * 7473 *
7474 * Return 1 meaning mf should be freed from _base_interrupt 7474 * Returns void.
7475 * 0 means the mf is freed from this function.
7476 */ 7475 */
7477u8 7476void
7478mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, 7477mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
7479 u32 reply) 7478 u32 reply)
7480{ 7479{
@@ -7485,14 +7484,14 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
7485 7484
7486 /* events turned off due to host reset or driver unloading */ 7485 /* events turned off due to host reset or driver unloading */
7487 if (ioc->remove_host || ioc->pci_error_recovery) 7486 if (ioc->remove_host || ioc->pci_error_recovery)
7488 return 1; 7487 return;
7489 7488
7490 mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); 7489 mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
7491 7490
7492 if (unlikely(!mpi_reply)) { 7491 if (unlikely(!mpi_reply)) {
7493 printk(MPT2SAS_ERR_FMT "mpi_reply not valid at %s:%d/%s()!\n", 7492 printk(MPT2SAS_ERR_FMT "mpi_reply not valid at %s:%d/%s()!\n",
7494 ioc->name, __FILE__, __LINE__, __func__); 7493 ioc->name, __FILE__, __LINE__, __func__);
7495 return 1; 7494 return;
7496 } 7495 }
7497 7496
7498 event = le16_to_cpu(mpi_reply->Event); 7497 event = le16_to_cpu(mpi_reply->Event);
@@ -7507,11 +7506,11 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
7507 7506
7508 if (baen_data->Primitive != 7507 if (baen_data->Primitive !=
7509 MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT) 7508 MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT)
7510 return 1; 7509 return;
7511 7510
7512 if (ioc->broadcast_aen_busy) { 7511 if (ioc->broadcast_aen_busy) {
7513 ioc->broadcast_aen_pending++; 7512 ioc->broadcast_aen_pending++;
7514 return 1; 7513 return;
7515 } else 7514 } else
7516 ioc->broadcast_aen_busy = 1; 7515 ioc->broadcast_aen_busy = 1;
7517 break; 7516 break;
@@ -7587,14 +7586,14 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
7587 break; 7586 break;
7588 7587
7589 default: /* ignore the rest */ 7588 default: /* ignore the rest */
7590 return 1; 7589 return;
7591 } 7590 }
7592 7591
7593 fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC); 7592 fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
7594 if (!fw_event) { 7593 if (!fw_event) {
7595 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", 7594 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
7596 ioc->name, __FILE__, __LINE__, __func__); 7595 ioc->name, __FILE__, __LINE__, __func__);
7597 return 1; 7596 return;
7598 } 7597 }
7599 sz = le16_to_cpu(mpi_reply->EventDataLength) * 4; 7598 sz = le16_to_cpu(mpi_reply->EventDataLength) * 4;
7600 fw_event->event_data = kzalloc(sz, GFP_ATOMIC); 7599 fw_event->event_data = kzalloc(sz, GFP_ATOMIC);
@@ -7602,7 +7601,7 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
7602 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", 7601 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
7603 ioc->name, __FILE__, __LINE__, __func__); 7602 ioc->name, __FILE__, __LINE__, __func__);
7604 kfree(fw_event); 7603 kfree(fw_event);
7605 return 1; 7604 return;
7606 } 7605 }
7607 7606
7608 memcpy(fw_event->event_data, mpi_reply->EventData, 7607 memcpy(fw_event->event_data, mpi_reply->EventData,
@@ -7612,7 +7611,7 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
7612 fw_event->VP_ID = mpi_reply->VP_ID; 7611 fw_event->VP_ID = mpi_reply->VP_ID;
7613 fw_event->event = event; 7612 fw_event->event = event;
7614 _scsih_fw_event_add(ioc, fw_event); 7613 _scsih_fw_event_add(ioc, fw_event);
7615 return 1; 7614 return;
7616} 7615}
7617 7616
7618/* shost template */ 7617/* shost template */