--- ./usr/src/sbin/fdisk/fdisk.c.orig	2008-01-21 19:27:24.000000000 +0900
+++ ./usr/src/sbin/fdisk/fdisk.c	2008-01-21 19:27:27.000000000 +0900
@@ -1467,7 +1467,7 @@
 			a2 -= s2;
 			num = (uint64_t)h1 * a2 - (uint64_t)h2 * a1;
 			denom = (uint64_t)c2 * a1 - (uint64_t)c1 * a2;
-			if (denom != 0 && num % denom == 0) {
+			if (denom != 0 && num != 0 && num % denom == 0) {
 				xheads = num / denom;
 				xsectors = a1 / (c1 * xheads + h1);
 				break;
@@ -1532,18 +1532,20 @@
 	if (i % 2 == 0) {
 		*cylinder = MBR_PCYL(part->mbrp_scyl, part->mbrp_ssect);
 		*head = part->mbrp_shd;
-		*sector = MBR_PSECT(part->mbrp_ssect) - 1;
+		*sector = MBR_PSECT(part->mbrp_ssect);
 		*absolute = le32toh(part->mbrp_start);
 	} else {
 		*cylinder = MBR_PCYL(part->mbrp_ecyl, part->mbrp_esect);
 		*head = part->mbrp_ehd;
-		*sector = MBR_PSECT(part->mbrp_esect) - 1;
+		*sector = MBR_PSECT(part->mbrp_esect);
 		*absolute = le32toh(part->mbrp_start)
 		    + le32toh(part->mbrp_size) - 1;
 	}
 	/* Sanity check the data against all zeroes */
 	if ((*cylinder == 0) && (*sector == 0) && (*head == 0))
 		return -1;
+	/* sector numbers in the MBR partition table start at 1 */
+	*sector = *sector - 1;
 	/* Sanity check the data against max values */
 	if ((((*cylinder * MAXHEAD) + *head) * MAXSECTOR + *sector) < *absolute)
 		/* cannot be a CHS mapping */