]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[hdprefix] Avoid attempts to read beyond the end of the disk
authorMichael Brown <mcb30@ipxe.org>
Tue, 13 Jun 2017 12:16:26 +0000 (13:16 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 14 Jun 2017 11:14:54 +0000 (12:14 +0100)
When booting from a hard disk image (e.g. bin/ipxe.usb) within an
emulator such as QEMU, the disk may not exist beyond the end of the
image.  Limit all reads to the length of the image to avoid spurious
errors when loading the iPXE image.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/prefix/hdprefix.S

index 24f5d3850cae894f6d062006f2de245014bc450d..28c8a532d2f9cfc2f61ebcada4ea3ab276ca393f 100644 (file)
@@ -27,14 +27,18 @@ load_image:
        popw    %es
        popal
        
-1:     /* Read to end of current track */
+1:     /* Read to end of current track (or end of image) */
        movb    %cl, %al
        negb    %al
        addb    max_sector, %al
        incb    %al
        andb    $0x3f, %al
        movzbl  %al, %eax
-       call    *read_sectors
+       movl    load_length, %ebx
+       cmpl    %eax, %ebx
+       ja      2f
+       movl    %ebx, %eax
+2:     call    *read_sectors
        jc      load_failed
        
        /* Update %es */
@@ -53,12 +57,12 @@ load_image:
        orb     $0x01, %cl
        incb    %dh
        cmpb    max_head, %dh
-       jbe     2f
+       jbe     3f
        xorb    %dh, %dh
        incb    %ch
-       jnc     2f
+       jnc     3f
        addb    $0xc0, %cl
-2:
+3:
        /* Loop until whole image is read */
        subl    %eax, load_length
        ja      1b