aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2017-06-13 13:16:26 +0100
committerMichael Brown <mcb30@ipxe.org>2017-06-14 12:14:54 +0100
commit84e25513b1ce6aeb4f0d6c9d20cd687c00591de8 (patch)
treea320041339f723551494e421693ce5733f9b56a3 /src/arch/x86
parent1fdf4dddbd6fa2329138e4374c46bbca1ad264c6 (diff)
downloadipxe-84e25513b1ce6aeb4f0d6c9d20cd687c00591de8.zip
ipxe-84e25513b1ce6aeb4f0d6c9d20cd687c00591de8.tar.gz
ipxe-84e25513b1ce6aeb4f0d6c9d20cd687c00591de8.tar.bz2
[hdprefix] Avoid attempts to read beyond the end of the disk
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>
Diffstat (limited to 'src/arch/x86')
-rw-r--r--src/arch/x86/prefix/hdprefix.S14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/arch/x86/prefix/hdprefix.S b/src/arch/x86/prefix/hdprefix.S
index 24f5d38..28c8a53 100644
--- a/src/arch/x86/prefix/hdprefix.S
+++ b/src/arch/x86/prefix/hdprefix.S
@@ -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