]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[util] Use PCI length field to obtain length of individual images
authorMichael Brown <mcb30@ipxe.org>
Tue, 26 Aug 2014 10:42:42 +0000 (11:42 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 26 Aug 2014 14:17:56 +0000 (15:17 +0100)
Option::ROM currently uses the initialisation length field (single
byte at offset 0x02) to determine the length of a ROM image within a
multi-image ROM file.  For PCI ROM images with a code type other than
0, the initialisation length field may not be present.

Fix by using the PCI header's image length field instead.  Note that
this does not prevent us from correctly handling ISA ROMs, since ISA
ROMs do not support multiple images within a single ROM BAR anyway.

Inspired-by: Swift Geek <swiftgeek@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/util/Option/ROM.pm

index fb37ce4b0cc4e27528afc4044143060f0668fe5e..6c396730e399c14514415b378959a525b779593a 100644 (file)
@@ -266,11 +266,10 @@ sub set {
 
   # Split out any data belonging to the next image
   delete $self->{next_image};
-  my $length = ( $hash->{length} * 512 );
   my $pci_header = $hash->pci_header();
-  if ( ( $length < length $data ) &&
-       ( defined $pci_header ) &&
+  if ( ( defined $pci_header ) &&
        ( ! ( $pci_header->{last_image} & PCI_LAST_IMAGE ) ) ) {
+    my $length = ( $pci_header->{image_length} * 512 );
     my $remainder = substr ( $data, $length );
     $data = substr ( $data, 0, $length );
     $self->{next_image} = new Option::ROM;