Module Name:    src
Committed By:   martin
Date:           Mon Feb 11 20:40:18 UTC 2019

Modified Files:
        src/usr.sbin/sysinst: bsddisklabel.c defs.h partman.c util.c

Log Message:
Fix a few off by one (in both directions) in previous, pointed out by mrg.
Avoid open coding snprintf return value checking and introduce a
helper functions that always ensures string termination instead,
suggested by christos.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/sysinst/bsddisklabel.c
cvs rdiff -u -r1.31 -r1.32 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.28 -r1.29 src/usr.sbin/sysinst/partman.c
cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/sysinst/util.c

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

Modified files:

Index: src/usr.sbin/sysinst/bsddisklabel.c
diff -u src/usr.sbin/sysinst/bsddisklabel.c:1.6 src/usr.sbin/sysinst/bsddisklabel.c:1.7
--- src/usr.sbin/sysinst/bsddisklabel.c:1.6	Tue Nov 20 19:02:07 2018
+++ src/usr.sbin/sysinst/bsddisklabel.c	Mon Feb 11 20:40:18 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: bsddisklabel.c,v 1.6 2018/11/20 19:02:07 martin Exp $	*/
+/*	$NetBSD: bsddisklabel.c,v 1.7 2019/02/11 20:40:18 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -224,7 +224,7 @@ set_ptn_size(menudesc *m, void *arg)
 	if (size == 0)
 		size = p->dflt_size;
 	size /= sizemult;
-	snprintf(dflt, sizeof dflt, "%" PRIi64 "%s",
+	trunc_snprintf(dflt, sizeof dflt, "%" PRIi64 "%s",
 	    size, p == pi->pool_part ? "+" : "");
 
 	for (;;) {

Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.31 src/usr.sbin/sysinst/defs.h:1.32
--- src/usr.sbin/sysinst/defs.h:1.31	Sun Jan 27 04:15:11 2019
+++ src/usr.sbin/sysinst/defs.h	Mon Feb 11 20:40:18 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.31 2019/01/27 04:15:11 oster Exp $	*/
+/*	$NetBSD: defs.h,v 1.32 2019/02/11 20:40:18 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -561,6 +561,9 @@ void	do_reinstall_sets(void);
 void	restore_etc(void);
 
 /* from util.c */
+/* like snprintf, but always terminates the output */
+void trunc_snprintf(char * restrict str, size_t size,
+    const char * restrict format, ...) __printflike(3, 4);
 char*	str_arg_subst(const char *, size_t, const char **);
 void	msg_display_subst(const char *, size_t, ...);
 int	ask_yesno(const char *);

Index: src/usr.sbin/sysinst/partman.c
diff -u src/usr.sbin/sysinst/partman.c:1.28 src/usr.sbin/sysinst/partman.c:1.29
--- src/usr.sbin/sysinst/partman.c:1.28	Mon Feb 11 20:03:28 2019
+++ src/usr.sbin/sysinst/partman.c	Mon Feb 11 20:40:18 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: partman.c,v 1.28 2019/02/11 20:03:28 martin Exp $ */
+/*	$NetBSD: partman.c,v 1.29 2019/02/11 20:40:18 martin Exp $ */
 
 /*
  * Copyright 2012 Eugene Lozovoy
@@ -255,23 +255,19 @@ pm_edit(int menu_entries_count, void (*m
 static void
 pm_getdevstring(char *buf, int len, pm_devs_t *pm_cur, int num)
 {
-	int i, r;
+	int i;
 
 	if (pm_cur->isspecial)
 		snprintf(buf, len, "%s", pm_cur->diskdev);
 	else if (num + 'a' < 'a' || num + 'a' > 'a' + MAXPARTITIONS) {
-		r = snprintf(buf, len-1, "%sd", pm_cur->diskdev);
-		if (r >= len)
-			buf[len] = 0;
+		trunc_snprintf(buf, len, "%sd", pm_cur->diskdev);
 	} else if (pm_cur->gpt) {
 		for (i = 0; i < MAX_WEDGES; i++)
 			if (wedges[i].pm == pm_cur &&
 				wedges[i].ptn == num)
 				snprintf(buf, len, "dk%d", i); // XXX: xxx
 	} else {
-		r = snprintf(buf, len-1, "%s%c", pm_cur->diskdev, num + 'a');
-		if (r >= len)
-			buf[len] = 0;
+		trunc_snprintf(buf, len, "%s%c", pm_cur->diskdev, num + 'a');
 	}
 
 	return;
@@ -1898,7 +1894,7 @@ pm_gpt_commit(void)
 int
 pm_getrefdev(pm_devs_t *pm_cur)
 {
-	int i, ii, dev_num, num_devs, num_devs_s, r;
+	int i, ii, dev_num, num_devs, num_devs_s;
 	char dev[SSTRSIZE]; dev[0] = '\0';
 
 	pm_cur->refdev = NULL;
@@ -1907,15 +1903,11 @@ pm_getrefdev(pm_devs_t *pm_cur)
 		for (i = 0; i < MAX_CGD; i++)
 			if (cgds[i].blocked && cgds[i].node == dev_num) {
 				pm_cur->refdev = &cgds[i];
-				r = snprintf(pm_cur->diskdev_descr,
-				    sizeof(pm_cur->diskdev_descr)-1,
+				trunc_snprintf(pm_cur->diskdev_descr,
+				    sizeof(pm_cur->diskdev_descr),
 				    "%s (%s, %s-%d)",
 				    pm_cur->diskdev_descr, cgds[i].pm_name,
 				    cgds[i].enc_type, cgds[i].key_size);
-				if (r >= (int)sizeof(pm_cur->diskdev_descr))
-					pm_cur->diskdev_descr[
-					    sizeof(pm_cur->diskdev_descr)-1]
-					    = 0;
 				break;
 			}
  	} else if (! strncmp(pm_cur->diskdev, "vnd", 3)) {
@@ -1925,15 +1917,11 @@ pm_getrefdev(pm_devs_t *pm_cur)
 				pm_cur->refdev = &vnds[i];
 				pm_getdevstring(dev, SSTRSIZE, vnds[i].pm,
 				    vnds[i].pm_part);
-				r = snprintf(pm_cur->diskdev_descr,
-				    sizeof(pm_cur->diskdev_descr)-1,
+				trunc_snprintf(pm_cur->diskdev_descr,
+				    sizeof(pm_cur->diskdev_descr),
 				    "%s (%s, %s)",
 				    pm_cur->diskdev_descr, dev,
 				    vnds[i].filepath);
-				if (r >= (int)sizeof(pm_cur->diskdev_descr))
-					pm_cur->diskdev_descr[
-					    sizeof(pm_cur->diskdev_descr)-1]
-					    = 0;
 				break;
 			}
 	} else if (! strncmp(pm_cur->diskdev, "raid", 4)) {
@@ -1949,14 +1937,10 @@ pm_getrefdev(pm_devs_t *pm_cur)
 						else
 							num_devs++;
 					}
-				r = snprintf(pm_cur->diskdev_descr,
-					sizeof(pm_cur->diskdev_descr)-1,
+				trunc_snprintf(pm_cur->diskdev_descr,
+					sizeof(pm_cur->diskdev_descr),
 					"%s (lvl %d, %d disks, %d spare)", pm_cur->diskdev_descr,
 					raids[i].raid_level, num_devs, num_devs_s);
-				if (r >= (int)sizeof(pm_cur->diskdev_descr))
-					pm_cur->diskdev_descr[
-					    sizeof(pm_cur->diskdev_descr)-1]
-					    = 0;
 				break;
 			}
 	} else
@@ -2201,16 +2185,14 @@ pm_mountall(void)
 static int
 pm_mount(pm_devs_t *pm_cur, int part_num)
 {
-	int error = 0, r;
+	int error = 0;
 	char buf[MOUNTLEN];
 
 	if (strlen(pm_cur->bsdlabel[part_num].mounted) > 0)
 		return 0;
 
-	r = snprintf(buf, sizeof(buf)-1, "/tmp/%s%c", pm_cur->diskdev,
+	trunc_snprintf(buf, sizeof(buf), "/tmp/%s%c", pm_cur->diskdev,
 	    part_num + 'a');
-	if (r >= (int)sizeof(buf))
-		buf[sizeof(buf)-1] = 0;
 	if (! dir_exists_p(buf))
 		run_program(RUN_DISPLAY | RUN_PROGRESS, "/bin/mkdir -p %s", buf);
 	if (pm_cur->bsdlabel[part_num].pi_flags & PIF_MOUNT &&
@@ -2505,7 +2487,7 @@ pm_menufmt(menudesc *m, int opt, void *a
 {
 	const char *dev_status = "";
 	char buf[STRSIZE];
-	int r, part_num = ((part_entry_t *)arg)[opt].dev_num;
+	int part_num = ((part_entry_t *)arg)[opt].dev_num;
 	pm_devs_t *pm_cur = ((part_entry_t *)arg)[opt].dev_ptr;
 
 	switch (((part_entry_t *)arg)[opt].type) {
@@ -2557,11 +2539,9 @@ pm_menufmt(menudesc *m, int opt, void *a
 				pm_cur->bsdlabel[part_num].pi_size / (MEG / pm_cur->sectorsize));
 			break;
 		case PM_SPEC_T:
-			r = snprintf(buf, sizeof(buf)-1, "%s: %s",
+			trunc_snprintf(buf, sizeof(buf), "%s: %s",
 			    pm_cur->diskdev_descr,
 			    pm_cur->bsdlabel[0].pi_mount);
-			if (r >= (int)sizeof(buf))
-				buf[sizeof(buf)-1] = 0;
 			wprintw(m->mw, "%-33.32s %-22.21s %11luM", buf,
 				getfslabelname(pm_cur->bsdlabel[0].pi_fstype),
 				pm_cur->bsdlabel[0].pi_size / (MEG / pm_cur->sectorsize));

Index: src/usr.sbin/sysinst/util.c
diff -u src/usr.sbin/sysinst/util.c:1.19 src/usr.sbin/sysinst/util.c:1.20
--- src/usr.sbin/sysinst/util.c:1.19	Sun Jan 27 02:08:51 2019
+++ src/usr.sbin/sysinst/util.c	Mon Feb 11 20:40:18 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: util.c,v 1.19 2019/01/27 02:08:51 pgoyette Exp $	*/
+/*	$NetBSD: util.c,v 1.20 2019/02/11 20:40:18 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -1882,3 +1882,20 @@ msg_display_subst(const char *master, si
 	free(args);
 }
 
+/*
+ * like snprintf, but always terminates the output
+ */
+void
+trunc_snprintf(char * restrict str, size_t size,
+     const char * restrict format, ...)
+{
+	int r;
+	va_list ap;
+
+	va_start(ap, format);
+	r = vsnprintf(str, size, format, ap);
+	va_end(ap);
+
+	if (r >= (int)size)
+		str[size-1] = 0;
+}

Reply via email to