Change most of the variables that hold disk sector number to be (at least)

uint32_t. Might make sysinst work on disks between 1TB and 2TB.
Not actually tested because I don't have a big disk.
Hopefully I haven't broken the small disk case!
Set WARNS= 4 so that comparisons of signed and unsigned block numbers
are trapped.
This commit is contained in:
dsl 2010-01-02 21:16:46 +00:00
parent 7dd4a9773c
commit 23ee525d3d
4 changed files with 72 additions and 74 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile.inc,v 1.48 2009/08/23 20:58:05 jmcneill Exp $
# $NetBSD: Makefile.inc,v 1.49 2010/01/02 21:16:46 dsl Exp $
#
# Makefile for sysinst
@ -7,7 +7,7 @@ COPTS += -Os
PROG= sysinst
NOMAN= # defined
WARNS= 3
WARNS= 4
SRCS+= menu_defs.c msg_defs.c main.c install.c upgrade.c \
txtwalk.c run.c factor.c net.c disks.c disks_lfs.c util.c geom.c \

View File

@ -1,4 +1,4 @@
/* $NetBSD: defs.h,v 1.146 2009/10/18 12:09:48 ahoka Exp $ */
/* $NetBSD: defs.h,v 1.147 2010/01/02 21:16:46 dsl Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -153,7 +153,7 @@ enum {
/* Round up to the next full cylinder size */
#define NUMSEC(size, sizemult, cylsize) \
((size) == -1 ? -1 : (sizemult) == 1 ? (size) : \
((size) == ~0u ? ~0u : (sizemult) == 1 ? (size) : \
roundup((size) * (sizemult), (cylsize)))
/* What FS type? */
@ -354,8 +354,6 @@ const char *get_last_mounted(int, int, partinfo *);
int savenewlabel(partinfo *, int);
int incorelabel(const char *, partinfo *);
int edit_and_check_label(partinfo *, int, int, int);
int getpartoff(int);
int getpartsize(int, int);
void set_bsize(partinfo *, int);
void set_fsize(partinfo *, int);
void set_ptype(partinfo *, int, int);

View File

@ -1,4 +1,4 @@
/* $NetBSD: label.c,v 1.53 2009/02/22 11:21:56 ad Exp $ */
/* $NetBSD: label.c,v 1.54 2010/01/02 21:16:46 dsl Exp $ */
/*
* Copyright 1997 Jonathan Stone
@ -36,7 +36,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: label.c,v 1.53 2009/02/22 11:21:56 ad Exp $");
__RCSID("$NetBSD: label.c,v 1.54 2010/01/02 21:16:46 dsl Exp $");
#endif
#include <sys/types.h>
@ -63,9 +63,11 @@ struct ptn_menu_info {
* local prototypes
*/
static int boringpart(partinfo *, int, int, int);
static uint32_t getpartoff(uint32_t);
static uint32_t getpartsize(uint32_t, uint32_t);
static int checklabel(partinfo *, int, int, int, int *, int *);
static void atofsb(const char *, int *, int *);
static int atofsb(const char *, uint32_t *, uint32_t *);
/*
@ -102,7 +104,7 @@ checklabel(partinfo *lp, int nparts, int rawpart, int bsdpart,
for (i = 0; i < nparts - 1; i ++ ) {
partinfo *ip = &lp[i];
int istart, istop;
uint32_t istart, istop;
/* skip unused or reserved partitions */
if (boringpart(lp, i, rawpart, bsdpart))
@ -117,7 +119,7 @@ checklabel(partinfo *lp, int nparts, int rawpart, int bsdpart,
for (j = i+1; j < nparts; j++) {
partinfo *jp = &lp[j];
int jstart, jstop;
uint32_t jstart, jstop;
/* skip unused or reserved partitions */
if (boringpart(lp, j, rawpart, bsdpart))
@ -168,16 +170,16 @@ static int
edit_fs_start(menudesc *m, void *arg)
{
partinfo *p = arg;
int start, size;
uint32_t start, end;
start = getpartoff(p->pi_offset);
size = p->pi_size;
if (size != 0) {
if (p->pi_size != 0) {
/* Try to keep end in the same place */
size += p->pi_offset - start;
if (size < 0)
size = 0;
p->pi_size = size;
end = p->pi_offset + p->pi_size;
if (end < start)
p->pi_size = 0;
else
p->pi_size = end - start;
}
p->pi_offset = start;
return 0;
@ -187,10 +189,10 @@ static int
edit_fs_size(menudesc *m, void *arg)
{
partinfo *p = arg;
int size;
uint32_t size;
size = getpartsize(p->pi_offset, p->pi_size);
if (size == -1)
if (size == ~0u)
size = dlsize - p->pi_offset;
p->pi_size = size;
return 0;
@ -369,7 +371,7 @@ edit_ptn(menudesc *menu, void *arg)
static int fspart_menu = -1;
static menu_ent all_fstypes[FSMAXTYPES];
partinfo *p, p_save;
int i;
unsigned int i;
if (fspart_menu == -1) {
fspart_menu = new_menu(NULL, fs_fields, nelem(fs_fields),
@ -779,11 +781,13 @@ get_last_mounted(int fd, int partstart, partinfo *lp)
}
/* Ask for a partition offset, check bounds and do the needed roundups */
int
getpartoff(int defpartstart)
static uint32_t
getpartoff(uint32_t defpartstart)
{
char defsize[20], isize[20], maxpartc;
int i, localsizemult, partn;
uint32_t i;
uint32_t localsizemult;
int partn;
const char *errmsg = "\n";
maxpartc = 'a' + getmaxpartitions() - 1;
@ -803,11 +807,11 @@ getpartoff(int defpartstart)
} else if (atoi(isize) == -1) {
i = ptstart;
localsizemult = 1;
} else
atofsb(isize, &i, &localsizemult);
if (i < 0) {
errmsg = msg_string(MSG_invalid_sector_number);
continue;
} else {
if (atofsb(isize, &i, &localsizemult)) {
errmsg = msg_string(MSG_invalid_sector_number);
continue;
}
}
/* round to cylinder size if localsizemult != 1 */
i = NUMSEC(i/localsizemult, localsizemult, dlcylsize);
@ -825,13 +829,13 @@ getpartoff(int defpartstart)
/* Ask for a partition size, check bounds and do the needed roundups */
int
getpartsize(int partstart, int defpartsize)
static uint32_t
getpartsize(uint32_t partstart, uint32_t defpartsize)
{
char dsize[20], isize[20], maxpartc;
const char *errmsg = "\n";
int i, partend, localsizemult;
int fsptend = ptstart + ptsize;
uint32_t i, partend, localsizemult;
uint32_t fsptend = ptstart + ptsize;
int partn;
maxpartc = 'a' + getmaxpartitions() - 1;
@ -850,11 +854,11 @@ getpartsize(int partstart, int defpartsize)
} else if (atoi(isize) == -1) {
i = fsptend - partstart;
localsizemult = 1;
} else
atofsb(isize, &i, &localsizemult);
if (i < 0) {
errmsg = msg_string(MSG_invalid_sector_number);
continue;
} else {
if (atofsb(isize, &i, &localsizemult)) {
errmsg = msg_string(MSG_invalid_sector_number);
continue;
}
}
/*
* partend is aligned to a cylinder if localsizemult
@ -863,11 +867,11 @@ getpartsize(int partstart, int defpartsize)
partend = NUMSEC((partstart + i) / localsizemult,
localsizemult, dlcylsize);
/* Align to end-of-disk or end-of-slice if close enough */
i = dlsize - partend;
if (i > -localsizemult && i < localsizemult)
if (partend > (dlsize - localsizemult)
&& partend < (dlsize + localsizemult))
partend = dlsize;
i = fsptend - partend;
if (i > -localsizemult && i < localsizemult)
if (partend > (fsptend - localsizemult)
&& partend < (fsptend + localsizemult))
partend = fsptend;
/* sanity checks */
if (partend > dlsize) {
@ -876,7 +880,6 @@ getpartsize(int partstart, int defpartsize)
NULL, isize, 1,
(partend - partstart) / sizemult, multname);
}
/* return value */
return (partend - partstart);
}
/* NOTREACHED */
@ -891,16 +894,15 @@ getpartsize(int partstart, int defpartsize)
* returns the number of sectors, and the unit used (for roundups).
*/
static void
atofsb(const char *str, int *p_val, int *localsizemult)
static int
atofsb(const char *str, uint32_t *p_val, uint32_t *localsizemult)
{
int i;
int val;
uint32_t val;
*localsizemult = sizemult;
if (str[0] == '\0') {
*p_val = -1;
return;
return 1;
}
val = 0;
for (i = 0; str[i] != '\0'; i++) {
@ -910,8 +912,7 @@ atofsb(const char *str, int *p_val, int *localsizemult)
}
if (str[i + 1] != '\0') {
/* A non-digit caracter, not at the end */
*p_val = -1;
return;
return 1;
}
if (str[i] == 'G' || str[i] == 'g') {
val *= 1024;
@ -931,9 +932,8 @@ atofsb(const char *str, int *p_val, int *localsizemult)
break;
}
/* not a known unit */
*p_val = -1;
return;
return 1;
}
*p_val = val * (*localsizemult);
return;
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: mbr.c,v 1.81 2009/09/19 14:57:27 abs Exp $ */
/* $NetBSD: mbr.c,v 1.82 2010/01/02 21:16:46 dsl Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -114,7 +114,7 @@ struct part_id {
};
static int get_mapping(struct mbr_partition *, int, int *, int *, int *,
unsigned long *);
daddr_t *);
static void convert_mbr_chs(int, int, int, uint8_t *, uint8_t *,
uint8_t *, uint32_t);
@ -252,16 +252,16 @@ disp_cur_geom(void)
* in the netbsd disklabel to the part we changed.
*/
static void
remove_old_partitions(uint start, int size)
remove_old_partitions(uint start, int64_t size)
{
partinfo *p;
uint end;
/* Allow for size being -ve, get it right for very large partitions */
end = start + size;
if (end < start) {
if (size > 0) {
end = start + size;
} else {
end = start;
start = end + size;
start = end - size;
}
if (end == 0)
@ -275,9 +275,9 @@ remove_old_partitions(uint start, int size)
}
static int
find_mbr_space(struct mbr_sector *mbrs, uint *start, uint *size, int from, int ignore)
find_mbr_space(struct mbr_sector *mbrs, uint *start, uint *size, uint from, int ignore)
{
int sz;
uint sz;
int i;
uint s, e;
@ -498,7 +498,7 @@ edit_mbr_type(menudesc *m, void *arg)
{
static menu_ent type_opts[1 + nelem(part_ids)];
static int type_menu = -1;
int i;
unsigned int i;
if (type_menu == -1) {
for (i = 0; i < nelem(type_opts); i++) {
@ -527,7 +527,7 @@ edit_mbr_start(menudesc *m, void *arg)
int opt = mbri->opt;
uint start, sz;
uint new_r, new, limit, dflt_r;
int delta;
int64_t delta;
const char *errmsg;
char *cp;
struct {
@ -535,10 +535,10 @@ edit_mbr_start(menudesc *m, void *arg)
uint start_r;
uint limit;
} freespace[MBR_PART_COUNT];
int spaces;
int i;
unsigned int spaces;
unsigned int i;
char prompt[MBR_PART_COUNT * 60];
int len;
unsigned int len;
char numbuf[12];
if (opt >= MBR_PART_COUNT)
@ -815,7 +815,7 @@ edit_mbr_size(menudesc *m, void *arg)
break;
}
if (opt >= MBR_PART_COUNT && max - new <= bsec)
if (opt >= MBR_PART_COUNT && max - new <= (uint32_t)bsec)
/* Round up if not enough space for a header for free area */
new = max;
@ -823,7 +823,7 @@ edit_mbr_size(menudesc *m, void *arg)
/* Kill information about old partition from label */
mbri->last_mounted[opt < MBR_PART_COUNT ? opt : 0] = NULL;
remove_old_partitions(mbri->sector + mbrp->mbrp_start +
mbrp->mbrp_size, new - mbrp->mbrp_size);
mbrp->mbrp_size, (int64_t)new - mbrp->mbrp_size);
}
mbrp->mbrp_size = new;
@ -1340,7 +1340,7 @@ edit_mbr(mbr_info_t *mbri)
}
/* Install in only netbsd partition if none tagged */
if (ptstart == 0 && bsdstart != ~0) {
if (ptstart == 0 && bsdstart != ~0u) {
ptstart = bsdstart;
ptsize = bsdsize;
}
@ -1425,7 +1425,7 @@ read_mbr(const char *disk, mbr_info_t *mbri)
for (;;) {
if (pread(fd, mbrs, sizeof *mbrs,
(ext_base + next_ext) * (off_t)MBR_SECSIZE) < sizeof *mbrs)
(ext_base + next_ext) * (off_t)MBR_SECSIZE) - sizeof *mbrs != 0)
break;
if (!valid_mbr(mbrs))
@ -1706,7 +1706,7 @@ guess_biosgeom_from_mbr(mbr_info_t *mbri, int *cyl, int *head, daddr_t *sec)
int xcylinders, xheads, i, j;
daddr_t xsectors;
int c1, h1, s1, c2, h2, s2;
unsigned long a1, a2;
daddr_t a1, a2;
uint64_t num, denom;
/*
@ -1791,7 +1791,7 @@ guess_biosgeom_from_mbr(mbr_info_t *mbri, int *cyl, int *head, daddr_t *sec)
static int
get_mapping(struct mbr_partition *parts, int i,
int *cylinder, int *head, int *sector, unsigned long *absolute)
int *cylinder, int *head, int *sector, daddr_t *absolute)
{
struct mbr_partition *apart = &parts[i / 2];
@ -1810,7 +1810,7 @@ get_mapping(struct mbr_partition *parts, int i,
+ le32toh(apart->mbrp_size) - 1;
}
/* Sanity check the data against max values */
if ((((*cylinder * MAXHEAD) + *head) * MAXSECTOR + *sector) < *absolute)
if ((((*cylinder * MAXHEAD) + *head) * (uint32_t)MAXSECTOR + *sector) < *absolute)
/* cannot be a CHS mapping */
return -1;