From 45a3e13ca81b685fa8b2996d83a6fbbbcba6d8be Mon Sep 17 00:00:00 2001 From: Toomas Soome Date: Wed, 22 Aug 2018 10:04:42 +0000 Subject: [PATCH] loader: bios loader should allow to chain load a file The current chain command does accept only device, allow also a file to be used, such as /boot/pmbr or /boot/mbr (or stored third party MBR/VBR block). Also fix file descriptor leak. --- stand/i386/loader/chain.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/stand/i386/loader/chain.c b/stand/i386/loader/chain.c index 5b615288de0..4e04cc4a23f 100644 --- a/stand/i386/loader/chain.c +++ b/stand/i386/loader/chain.c @@ -92,24 +92,26 @@ command_chain(int argc, char *argv[]) i386_getdev((void **)(&rootdev), argv[1], NULL); if (rootdev == NULL) { command_errmsg = "can't determine root device"; + close(fd); return (CMD_ERROR); } - if (archsw.arch_readin(fd, mem, SECTOR_SIZE) != SECTOR_SIZE) { + if (archsw.arch_readin(fd, mem, size) != size) { command_errmsg = "failed to read disk"; close(fd); return (CMD_ERROR); } close(fd); - if (*((uint16_t *)PTOV(mem + DOSMAGICOFFSET)) != DOSMAGIC) { + if (argv[1][len-1] == ':' && + *((uint16_t *)PTOV(mem + DOSMAGICOFFSET)) != DOSMAGIC) { command_errmsg = "wrong magic"; return (CMD_ERROR); } relocater_data[0].src = mem; relocater_data[0].dest = 0x7C00; - relocater_data[0].size = SECTOR_SIZE; + relocater_data[0].size = size; relocator_edx = bd_unit2bios(rootdev->dd.d_unit); relocator_esi = relocater_size;