]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[pci] Ensure that pci_read_config() initialises all fields
authorMichael Brown <mcb30@ipxe.org>
Wed, 16 Feb 2022 12:30:02 +0000 (12:30 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 16 Feb 2022 12:55:28 +0000 (12:55 +0000)
As per the general pattern for initialisation functions in iPXE,
pci_init() saves code size by assuming that the caller has already
zeroed the underlying storage (e.g. as part of zeroing a larger
containing structure).  There are several places within the code where
pci_init() is deliberately used to initialise a transient struct
pci_device without zeroing the entire structure, because the calling
code knows that only the PCI bus:dev.fn address is required to be
initialised (e.g. when reading from PCI configuration space).

Ensure that using pci_init() followed by pci_read_config() will fully
initialise the struct pci_device even if the caller did not previously
zero the underlying storage, since Coverity reports that there are
several places in the code that rely upon this.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bus/pci.c

index 1b7350c8b8cea04b4e0653ced344d8c07e1a49f4..5891e42ff4dc6c8d00c2d6b131048fb60173f10f 100644 (file)
@@ -121,6 +121,11 @@ static void pci_read_bases ( struct pci_device *pci ) {
        unsigned long bar;
        int reg;
 
+       /* Clear any existing base addresses */
+       pci->ioaddr = 0;
+       pci->membase = 0;
+
+       /* Get first memory and I/O BAR addresses */
        for ( reg = PCI_BASE_ADDRESS_0; reg <= PCI_BASE_ADDRESS_5; reg += 4 ) {
                bar = pci_bar ( pci, reg );
                if ( bar & PCI_BASE_ADDRESS_SPACE_IO ) {