--- ./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 */