From: H. Peter Anvin Date: Fri, 5 Mar 2010 19:13:28 +0000 (-0800) Subject: chain.c32: Fix chaining to MBRs X-Git-Tag: syslinux-3.86-pre1~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7a82ceb63d9f67fa4018d28c698c72df7f554add;p=platform%2Fupstream%2Fsyslinux.git chain.c32: Fix chaining to MBRs The change to load the bootsector even when loading a bootstrap from a file broke the handing of chainloading the MBR of a disk. Fix this. Debugging-info-by: Thomas Mieslinger Signed-off-by: H. Peter Anvin --- diff --git a/com32/modules/chain.c b/com32/modules/chain.c index 9b6988d..160aa70 100644 --- a/com32/modules/chain.c +++ b/com32/modules/chain.c @@ -690,7 +690,6 @@ static void usage(void) int main(int argc, char *argv[]) { char *mbr, *p; - void *boot_sector = NULL; struct part_entry *partinfo; struct syslinux_rm_regs regs; char *drivename, *partition; @@ -850,7 +849,6 @@ int main(int argc, char *argv[]) /* Boot the MBR */ partinfo = NULL; - boot_sector = mbr; } else if (whichpart <= 4) { /* Boot a primary partition */ @@ -950,10 +948,11 @@ int main(int argc, char *argv[]) ndata++; } - if (partinfo && (!opt.loadfile || data[0].base >= 0x7c00 + SECTOR)) { + if (!opt.loadfile || data[0].base >= 0x7c00 + SECTOR) { /* Actually read the boot sector */ - /* Pick the first buffer that isn't already in use */ - if (!(data[ndata].data = read_sector(partinfo->start_lba))) { + if (!partinfo) { + data[ndata].data = mbr; + } else if (!(data[ndata].data = read_sector(partinfo->start_lba))) { error("Cannot read boot sector\n"); goto bail; } @@ -972,7 +971,7 @@ int main(int argc, char *argv[]) * the string "cmdcons\0" to memory location 0000:7C03. * Memory location 0000:7C00 contains the bootsector of the partition. */ - if (opt.cmldr) { + if (partinfo && opt.cmldr) { memcpy((char *)data[ndata].data+3, cmldr_signature, sizeof cmldr_signature); }