From 3c123fd0201e0421386aefa02a362ca2a1f860e5 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Tue, 5 Apr 2011 14:24:07 -0700 Subject: installer: Update and correct generate_extents() 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 --- libinstaller/syslxmod.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'libinstaller/syslxmod.c') diff --git a/libinstaller/syslxmod.c b/libinstaller/syslxmod.c index a68f19fb..8847b736 100644 --- a/libinstaller/syslxmod.c +++ b/libinstaller/syslxmod.c @@ -33,26 +33,29 @@ 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++; -- cgit v1.2.1