diff options
author | Russell Currey <ruscur@russell.cc> | 2016-09-12 00:17:22 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-09-22 17:54:20 -0400 |
commit | 04fec21c06e35b169a83e75a84a015ab4606bf5e (patch) | |
tree | 88e4eea89c5f8496006d5c25ebc277f57e51c8b3 | |
parent | a24553dd02dc6c7d2912af0b4b9c7f833c90e561 (diff) |
powerpc/eeh: Null check uses of eeh_pe_bus_get
eeh_pe_bus_get() can return NULL if a PCI bus isn't found for a given PE.
Some callers don't check this, and can cause a null pointer dereference
under certain circumstances.
Fix this by checking NULL everywhere eeh_pe_bus_get() is called.
Fixes: 8a6b1bc70dbb ("powerpc/eeh: EEH core to handle special event")
Cc: stable@vger.kernel.org # v3.11+
Signed-off-by: Russell Currey <ruscur@russell.cc>
Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/kernel/eeh_driver.c | 8 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/eeh-powernv.c | 5 |
2 files changed, 13 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index 5f36e8a70daa..29aa8d1ce273 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c | |||
@@ -994,6 +994,14 @@ static void eeh_handle_special_event(void) | |||
994 | /* Notify all devices to be down */ | 994 | /* Notify all devices to be down */ |
995 | eeh_pe_state_clear(pe, EEH_PE_PRI_BUS); | 995 | eeh_pe_state_clear(pe, EEH_PE_PRI_BUS); |
996 | bus = eeh_pe_bus_get(phb_pe); | 996 | bus = eeh_pe_bus_get(phb_pe); |
997 | if (!bus) { | ||
998 | pr_err("%s: Cannot find PCI bus for " | ||
999 | "PHB#%d-PE#%x\n", | ||
1000 | __func__, | ||
1001 | pe->phb->global_number, | ||
1002 | pe->addr); | ||
1003 | break; | ||
1004 | } | ||
997 | eeh_pe_dev_traverse(pe, | 1005 | eeh_pe_dev_traverse(pe, |
998 | eeh_report_failure, NULL); | 1006 | eeh_report_failure, NULL); |
999 | pci_hp_remove_devices(bus); | 1007 | pci_hp_remove_devices(bus); |
diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c index 86544ea85dc3..cb08e6aaf9bd 100644 --- a/arch/powerpc/platforms/powernv/eeh-powernv.c +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c | |||
@@ -1091,6 +1091,11 @@ static int pnv_eeh_reset(struct eeh_pe *pe, int option) | |||
1091 | } | 1091 | } |
1092 | 1092 | ||
1093 | bus = eeh_pe_bus_get(pe); | 1093 | bus = eeh_pe_bus_get(pe); |
1094 | if (!bus) { | ||
1095 | pr_err("%s: Cannot find PCI bus for PHB#%d-PE#%x\n", | ||
1096 | __func__, pe->phb->global_number, pe->addr); | ||
1097 | return -EIO; | ||
1098 | } | ||
1094 | if (pe->type & EEH_PE_VF) | 1099 | if (pe->type & EEH_PE_VF) |
1095 | return pnv_eeh_reset_vf_pe(pe, option); | 1100 | return pnv_eeh_reset_vf_pe(pe, option); |
1096 | 1101 | ||