[syslinux:master] chain.c32: Fix chaining to MBRs

syslinux-bot for H. Peter Anvin hpa at zytor.com
Fri Mar 5 11:21:03 PST 2010


Commit-ID:  7a82ceb63d9f67fa4018d28c698c72df7f554add
Gitweb:     http://syslinux.zytor.com/commit/7a82ceb63d9f67fa4018d28c698c72df7f554add
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Fri, 5 Mar 2010 11:13:28 -0800
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Fri, 5 Mar 2010 11:13:28 -0800

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 <thomas.mieslinger at lundl.de>
Signed-off-by: H. Peter Anvin <hpa at zytor.com>


---
 com32/modules/chain.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

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);
 	}



More information about the Syslinux-commits mailing list