svn commit: r338188 - head/stand/i386/loader

Toomas Soome tsoome at FreeBSD.org
Wed Aug 22 10:04:43 UTC 2018


Author: tsoome
Date: Wed Aug 22 10:04:42 2018
New Revision: 338188
URL: https://svnweb.freebsd.org/changeset/base/338188

Log:
  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.

Modified:
  head/stand/i386/loader/chain.c

Modified: head/stand/i386/loader/chain.c
==============================================================================
--- head/stand/i386/loader/chain.c	Wed Aug 22 09:49:38 2018	(r338187)
+++ head/stand/i386/loader/chain.c	Wed Aug 22 10:04:42 2018	(r338188)
@@ -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;


More information about the svn-src-head mailing list