svn commit: r271843 - stable/10/usr.bin/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Thu Sep 18 22:16:21 UTC 2014


Author: marcel
Date: Thu Sep 18 22:16:20 2014
New Revision: 271843
URL: http://svnweb.freebsd.org/changeset/base/271843

Log:
  Fix checksum calculation:
  1.  Iterate over all partitions counted in the label, which can be more
     than the number of partitions given to mkimg(1).
  2.  Start the checksum from the beginning of the label; not the beginning
     of the bootarea.
  
  Tested with bsdlabel(8).
  
  Approved by:	re@ (rodrigc)

Modified:
  stable/10/usr.bin/mkimg/bsd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.bin/mkimg/bsd.c
==============================================================================
--- stable/10/usr.bin/mkimg/bsd.c	Thu Sep 18 22:12:52 2014	(r271842)
+++ stable/10/usr.bin/mkimg/bsd.c	Thu Sep 18 22:16:20 2014	(r271843)
@@ -68,7 +68,7 @@ bsd_write(lba_t imgsz, void *bootcode)
 	struct disklabel *d;
 	struct partition *dp;
 	struct part *part;
-	int error, n;
+	int bsdparts, error, n;
 	uint16_t checksum;
 
 	buf = malloc(BBSIZE);
@@ -80,6 +80,9 @@ bsd_write(lba_t imgsz, void *bootcode)
 	} else
 		memset(buf, 0, BBSIZE);
 
+	bsdparts = nparts + 1;	/* Account for c partition */
+	if (bsdparts < MAXPARTITIONS)
+		bsdparts = MAXPARTITIONS;
 	imgsz = (lba_t)ncyls * nheads * nsecs;
 	error = image_set_size(imgsz);
 	if (error) {
@@ -97,7 +100,7 @@ bsd_write(lba_t imgsz, void *bootcode)
 	le32enc(&d->d_secperunit, imgsz);
 	le16enc(&d->d_rpm, 3600);
 	le32enc(&d->d_magic2, DISKMAGIC);
-	le16enc(&d->d_npartitions, (8 > nparts + 1) ? 8 : nparts + 1);
+	le16enc(&d->d_npartitions, bsdparts);
 	le32enc(&d->d_bbsize, BBSIZE);
 
 	dp = &d->d_partitions[RAW_PART];
@@ -110,9 +113,9 @@ bsd_write(lba_t imgsz, void *bootcode)
 		dp->p_fstype = ALIAS_TYPE2INT(part->type);
 	}
 
-	dp = &d->d_partitions[nparts + 1];
+	dp = &d->d_partitions[bsdparts];
 	checksum = 0;
-	for (p = buf; p < (u_char *)dp; p += 2)
+	for (p = (void *)d; p < (u_char *)dp; p += 2)
 		checksum ^= le16dec(p);
 	le16enc(&d->d_checksum, checksum);
 


More information about the svn-src-all mailing list