installer: Update and correct generate_extents()
authorH. Peter Anvin <hpa@linux.intel.com>
Tue, 5 Apr 2011 21:24:07 +0000 (14:24 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Tue, 5 Apr 2011 21:24:07 +0000 (14:24 -0700)
1. Make sure extents are strictly less than 64K in size
2. Make sure extents do not cross 64K boundaries

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
libinstaller/syslxmod.c

index a68f19f..8847b73 100644 (file)
 static void generate_extents(struct syslinux_extent *ex, int nptrs,
                             const sector_t *sectp, int nsect)
 {
-    uint32_t addr = 0x7c00 + 2*SECTOR_SIZE;
+    uint32_t addr = 0x8000;    /* ldlinux.sys starts loading here */
     uint32_t base;
     sector_t sect, lba;
     unsigned int len;
 
-    len = lba = base = 0;
+    base = addr;
+    len = lba = 0;
 
     memset(ex, 0, nptrs * sizeof *ex);
 
     while (nsect) {
        sect = *sectp++;
 
-       if (len && sect == lba + len &&
-           ((addr ^ (base + len * SECTOR_SIZE)) & 0xffff0000) == 0) {
-           /* We can add to the current extent */
-           len++;
-           goto next;
-       }
-
        if (len) {
+           uint32_t xbytes = (len + 1) * SECTOR_SIZE;
+
+           if (sect == lba + len && xbytes < 65536 &&
+               ((addr ^ (base + xbytes - 1)) & 0xffff0000) == 0) {
+               /* We can add to the current extent */
+               len++;
+               goto next;
+           }
+
            set_64_sl(&ex->lba, lba);
            set_16_sl(&ex->len, len);
            ex++;