ShellPkg/Pci: Add valid check for PCI extended config space parser

Bugzilla: 3262 (https://bugzilla.tianocore.org/show_bug.cgi?id=3262)

No need to print PCIe details while CapabilityId is 0xFFFF.
Limit the NextCapabilityOffset to PCI configuration space.

Signed-off-by: VincentX Ke <vincentx.ke@intel.com>
Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>
This commit is contained in:
VincentX Ke 2021-04-10 22:15:09 +08:00 committed by mergify[bot]
parent ca31888271
commit 3d0df0f076
1 changed files with 8 additions and 2 deletions

View File

@ -2038,12 +2038,14 @@ LocatePciCapability (
@param[in] PciExpressCap PCI Express capability buffer. @param[in] PciExpressCap PCI Express capability buffer.
@param[in] ExtendedConfigSpace PCI Express extended configuration space. @param[in] ExtendedConfigSpace PCI Express extended configuration space.
@param[in] ExtendedConfigSize PCI Express extended configuration size.
@param[in] ExtendedCapability PCI Express extended capability ID to explain. @param[in] ExtendedCapability PCI Express extended capability ID to explain.
**/ **/
VOID VOID
PciExplainPciExpress ( PciExplainPciExpress (
IN PCI_CAPABILITY_PCIEXP *PciExpressCap, IN PCI_CAPABILITY_PCIEXP *PciExpressCap,
IN UINT8 *ExtendedConfigSpace, IN UINT8 *ExtendedConfigSpace,
IN UINTN ExtendedConfigSize,
IN CONST UINT16 ExtendedCapability IN CONST UINT16 ExtendedCapability
); );
@ -2921,6 +2923,7 @@ ShellCommandRunPci (
PciExplainPciExpress ( PciExplainPciExpress (
(PCI_CAPABILITY_PCIEXP *) ((UINT8 *) &ConfigSpace + PcieCapabilityPtr), (PCI_CAPABILITY_PCIEXP *) ((UINT8 *) &ConfigSpace + PcieCapabilityPtr),
ExtendedConfigSpace, ExtendedConfigSpace,
ExtendedConfigSize,
ExtendedCapability ExtendedCapability
); );
} }
@ -5698,12 +5701,14 @@ PrintPciExtendedCapabilityDetails(
@param[in] PciExpressCap PCI Express capability buffer. @param[in] PciExpressCap PCI Express capability buffer.
@param[in] ExtendedConfigSpace PCI Express extended configuration space. @param[in] ExtendedConfigSpace PCI Express extended configuration space.
@param[in] ExtendedConfigSize PCI Express extended configuration size.
@param[in] ExtendedCapability PCI Express extended capability ID to explain. @param[in] ExtendedCapability PCI Express extended capability ID to explain.
**/ **/
VOID VOID
PciExplainPciExpress ( PciExplainPciExpress (
IN PCI_CAPABILITY_PCIEXP *PciExpressCap, IN PCI_CAPABILITY_PCIEXP *PciExpressCap,
IN UINT8 *ExtendedConfigSpace, IN UINT8 *ExtendedConfigSpace,
IN UINTN ExtendedConfigSize,
IN CONST UINT16 ExtendedCapability IN CONST UINT16 ExtendedCapability
) )
{ {
@ -5786,7 +5791,7 @@ PciExplainPciExpress (
} }
ExtHdr = (PCI_EXP_EXT_HDR*)ExtendedConfigSpace; ExtHdr = (PCI_EXP_EXT_HDR*)ExtendedConfigSpace;
while (ExtHdr->CapabilityId != 0 && ExtHdr->CapabilityVersion != 0) { while (ExtHdr->CapabilityId != 0 && ExtHdr->CapabilityVersion != 0 && ExtHdr->CapabilityId != 0xFFFF) {
// //
// Process this item // Process this item
// //
@ -5800,7 +5805,8 @@ PciExplainPciExpress (
// //
// Advance to the next item if it exists // Advance to the next item if it exists
// //
if (ExtHdr->NextCapabilityOffset != 0) { if (ExtHdr->NextCapabilityOffset != 0 &&
(ExtHdr->NextCapabilityOffset <= (UINT32) (ExtendedConfigSize + EFI_PCIE_CAPABILITY_BASE_OFFSET - sizeof (PCI_EXP_EXT_HDR)))) {
ExtHdr = (PCI_EXP_EXT_HDR*)(ExtendedConfigSpace + ExtHdr->NextCapabilityOffset - EFI_PCIE_CAPABILITY_BASE_OFFSET); ExtHdr = (PCI_EXP_EXT_HDR*)(ExtendedConfigSpace + ExtHdr->NextCapabilityOffset - EFI_PCIE_CAPABILITY_BASE_OFFSET);
} else { } else {
break; break;