diff options
author | Sreekanth Reddy <Sreekanth.Reddy@lsi.com> | 2013-07-25 01:54:35 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-09-03 10:27:50 -0400 |
commit | 6409a7d000020ffdd61082af8bb24291d2cdc1a6 (patch) | |
tree | fa4b48400632251539614715ba356ff6e086fa70 /drivers/scsi/mpt2sas/mpt2sas_scsih.c | |
parent | 804a5cb526c121226830c686132b1b82aa12b76c (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.c | 21 |
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 | */ |
7477 | u8 | 7476 | void |
7478 | mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, | 7477 | mpt2sas_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 */ |