svn commit: r223332 - head/sys/geom/part

Andrey V. Elsukov ae at FreeBSD.org
Mon Jun 20 12:22:30 UTC 2011


Author: ae
Date: Mon Jun 20 12:22:30 2011
New Revision: 223332
URL: http://svn.freebsd.org/changeset/base/223332

Log:
  Change the way how we update bootcode for BSD scheme.
  Since the only parameter that we check is size of bootcode, then
  allow only two sizes: size of boot1 and size of /boot/boot.
  This partially protects users from losing ability to boot if incorrect
  bootcode is specified.
  
  Requested by:	ru

Modified:
  head/sys/geom/part/g_part_bsd.c

Modified: head/sys/geom/part/g_part_bsd.c
==============================================================================
--- head/sys/geom/part/g_part_bsd.c	Mon Jun 20 11:46:03 2011	(r223331)
+++ head/sys/geom/part/g_part_bsd.c	Mon Jun 20 12:22:30 2011	(r223332)
@@ -46,6 +46,11 @@ __FBSDID("$FreeBSD$");
 
 #include "g_part_if.h"
 
+#define	BOOT1_SIZE	512
+#define	LABEL_SIZE	512
+#define	BOOT2_OFF	(BOOT1_SIZE + LABEL_SIZE)
+#define	BOOT2_SIZE	(BBSIZE - BOOT2_OFF)
+
 FEATURE(geom_part_bsd, "GEOM partitioning class for BSD disklabels");
 
 struct g_part_bsd_table {
@@ -170,22 +175,16 @@ g_part_bsd_bootcode(struct g_part_table 
 {
 	struct g_part_bsd_table *table;
 	const u_char *codeptr;
-	size_t hdsz, tlsz;
-	size_t codesz, tlofs;
 
-	hdsz = 512;
-	tlofs = hdsz + 148 + basetable->gpt_entries * 16;
-	tlsz = BBSIZE - tlofs;
+	if (gpp->gpp_codesize != BOOT1_SIZE && gpp->gpp_codesize != BBSIZE)
+		return (ENODEV);
+
 	table = (struct g_part_bsd_table *)basetable;
-	bzero(table->bbarea, hdsz);
-	bzero(table->bbarea + tlofs, tlsz);
 	codeptr = gpp->gpp_codeptr;
-	codesz = MIN(hdsz, gpp->gpp_codesize);
-	if (codesz > 0)
-		bcopy(codeptr, table->bbarea, codesz);
-	codesz = MIN(tlsz, gpp->gpp_codesize - tlofs);
-	if (codesz > 0)
-		bcopy(codeptr + tlofs, table->bbarea + tlofs, codesz);
+	bcopy(codeptr, table->bbarea, BOOT1_SIZE);
+	if (gpp->gpp_codesize == BBSIZE)
+		bcopy(codeptr + BOOT2_OFF, table->bbarea + BOOT2_OFF,
+		    BOOT2_SIZE);
 	return (0);
 }
 


More information about the svn-src-head mailing list