Module Name:    src
Committed By:   dsl
Date:           Sat Jan  2 21:16:47 UTC 2010

Modified Files:
        src/distrib/utils/sysinst: Makefile.inc defs.h label.c mbr.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/distrib/utils/sysinst/Makefile.inc
cvs rdiff -u -r1.146 -r1.147 src/distrib/utils/sysinst/defs.h
cvs rdiff -u -r1.53 -r1.54 src/distrib/utils/sysinst/label.c
cvs rdiff -u -r1.81 -r1.82 src/distrib/utils/sysinst/mbr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/utils/sysinst/Makefile.inc
diff -u src/distrib/utils/sysinst/Makefile.inc:1.48 src/distrib/utils/sysinst/Makefile.inc:1.49
--- src/distrib/utils/sysinst/Makefile.inc:1.48	Sun Aug 23 20:58:05 2009
+++ src/distrib/utils/sysinst/Makefile.inc	Sat Jan  2 21:16:46 2010
@@ -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 @@
 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 \

Index: src/distrib/utils/sysinst/defs.h
diff -u src/distrib/utils/sysinst/defs.h:1.146 src/distrib/utils/sysinst/defs.h:1.147
--- src/distrib/utils/sysinst/defs.h:1.146	Sun Oct 18 12:09:48 2009
+++ src/distrib/utils/sysinst/defs.h	Sat Jan  2 21:16:46 2010
@@ -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 @@
 
 /* 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 @@
 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);

Index: src/distrib/utils/sysinst/label.c
diff -u src/distrib/utils/sysinst/label.c:1.53 src/distrib/utils/sysinst/label.c:1.54
--- src/distrib/utils/sysinst/label.c:1.53	Sun Feb 22 11:21:56 2009
+++ src/distrib/utils/sysinst/label.c	Sat Jan  2 21:16:46 2010
@@ -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 @@
  * 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 @@
 
 	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 @@
 
 		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 @@
 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 @@
 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 @@
 	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 @@
 }
 
 /* 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 @@
 		} 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 @@
 
 
 /* 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 @@
 		} 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 @@
 		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 @@
 			    NULL, isize, 1,
 			    (partend - partstart) / sizemult, multname);
 		}
-		/* return value */
 		return (partend - partstart);
 	}
 	/* NOTREACHED */
@@ -891,16 +894,15 @@
  * 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 @@
 		}
 		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 @@
 			break;
 		}
 		/* not a known unit */
-		*p_val = -1;
-		return;
+		return 1;
 	}
 	*p_val = val * (*localsizemult);
-	return;
+	return 0;
 }

Index: src/distrib/utils/sysinst/mbr.c
diff -u src/distrib/utils/sysinst/mbr.c:1.81 src/distrib/utils/sysinst/mbr.c:1.82
--- src/distrib/utils/sysinst/mbr.c:1.81	Sat Sep 19 14:57:27 2009
+++ src/distrib/utils/sysinst/mbr.c	Sat Jan  2 21:16:46 2010
@@ -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 @@
 };
 
 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 @@
  * 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 @@
 }
 
 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 @@
 {
 	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 @@
 	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 @@
 		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 @@
 		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 @@
 		/* 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 @@
 		}
 
 		/* 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 @@
 
 	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 @@
 	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 @@
 
 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 @@
 			+ 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;
 

Reply via email to