Rework the checking of the typed size against the limit so we don't error

if the size is too large after we've rounded up to a cylinder boundary.
Stops silly errors (4170 > 4172) when partitions end at the end of the disk.
This commit is contained in:
dsl 2005-11-05 09:58:32 +00:00
parent f95e28696d
commit 4fba43286a
1 changed files with 24 additions and 19 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: mbr.c,v 1.70 2005/09/22 15:41:14 chs Exp $ */
/* $NetBSD: mbr.c,v 1.71 2005/11/05 09:58:32 dsl Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -701,6 +701,7 @@ edit_mbr_size(menudesc *m, void *arg)
}
start = mbri->sector + mbrp->mbrp_start;
/* We need to keep both the unrounded and rounded (_r) max and dflt */
dflt_r = (start + dflt) / sizemult - start / sizemult;
if (max == dflt)
max_r = dflt_r;
@ -716,27 +717,31 @@ edit_mbr_size(menudesc *m, void *arg)
errmsg = MSG_Invalid_numeric;
continue;
}
if (new == 0 || new == max_r)
new = max;
else {
if (new == dflt_r)
new = dflt;
else {
/* Round end to cylinder boundary */
if (sizemult != 1) {
new *= sizemult;
new += ROUNDDOWN(start,current_cylsize);
new = ROUNDUP(new, current_cylsize);
new -= start;
while (new <= 0)
new += current_cylsize;
}
}
}
if (new > max) {
if (new > max_r) {
errmsg = MSG_Too_large;
continue;
}
if (new == 0)
/* Treat zero as a request for the maximum */
new = max_r;
if (new == dflt_r)
/* If unchanged, don't re-round size */
new = dflt;
else {
/* Round end to cylinder boundary */
if (sizemult != 1) {
new *= sizemult;
new += ROUNDDOWN(start,current_cylsize);
new = ROUNDUP(new, current_cylsize);
new -= start;
while (new <= 0)
new += current_cylsize;
}
}
if (new > max)
/* We rounded the value to above the max */
new = max;
if (new == dflt || opt >= MBR_PART_COUNT
|| !MBR_IS_EXTENDED(mbrp->mbrp_type))
break;