diff --git a/src/drivers/bus/pci.c b/src/drivers/bus/pci.c index 30163300a..15d2da088 100644 --- a/src/drivers/bus/pci.c +++ b/src/drivers/bus/pci.c @@ -352,13 +352,20 @@ int pci_find_next ( struct pci_device *pci, uint32_t *busdevfn ) { hdrtype &= PCI_HEADER_TYPE_MASK; if ( hdrtype == PCI_HEADER_TYPE_BRIDGE ) { pci_read_config_byte ( pci, PCI_SUBORDINATE, &sub ); - end = PCI_BUSDEVFN ( PCI_SEG ( *busdevfn ), - ( sub + 1 ), 0, 0 ); - count = ( end - range.start ); - if ( count > range.count ) { - DBGC ( pci, PCI_FMT " found subordinate bus " - "%#02x\n", PCI_ARGS ( pci ), sub ); - range.count = count; + if ( sub <= PCI_BUS ( *busdevfn ) ) { + DBGC ( pci, PCI_FMT " ignoring invalid " + "subordinate bus %#02x\n", + PCI_ARGS ( pci ), sub ); + } else { + end = PCI_BUSDEVFN ( PCI_SEG ( *busdevfn ), + ( sub + 1 ), 0, 0 ); + count = ( end - range.start ); + if ( count > range.count ) { + DBGC ( pci, PCI_FMT " found " + "subordinate bus %#02x\n", + PCI_ARGS ( pci ), sub ); + range.count = count; + } } }