diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index f955edb..2fb5013 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c @@ -75,6 +75,7 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) image = rom; do { void __iomem *pds; + u16 length; /* Standard PCI ROMs start out with these bytes 55 AA */ if (readb(image) != 0x55) { dev_err(&pdev->dev, "Invalid ROM contents\n"); @@ -93,8 +94,10 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) if (readb(pds + 3) != 'R') break; last_image = readb(pds + 21) & 0x80; - /* this length is reliable */ - image += readw(pds + 16) * 512; + length = readw(pds + 16); + if (!length) + break; + image += length * 512; } while (!last_image); /* never return a size larger than the PCI resource window */