[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