Module Name:    src
Committed By:   maxv
Date:           Sun Jun  5 13:33:03 UTC 2016

Modified Files:
        src/sys/arch/i386/stand/lib: bootmenu.c menuutils.c
        src/sys/lib/libsa: gets.c stand.h

Log Message:
Use gets_s instead of gets. The x86 bootloader prompt is easy to
overflow.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/i386/stand/lib/bootmenu.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/i386/stand/lib/menuutils.c
cvs rdiff -u -r1.10 -r1.11 src/sys/lib/libsa/gets.c
cvs rdiff -u -r1.79 -r1.80 src/sys/lib/libsa/stand.h

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

Modified files:

Index: src/sys/arch/i386/stand/lib/bootmenu.c
diff -u src/sys/arch/i386/stand/lib/bootmenu.c:1.14 src/sys/arch/i386/stand/lib/bootmenu.c:1.15
--- src/sys/arch/i386/stand/lib/bootmenu.c:1.14	Sun Aug 10 07:40:49 2014
+++ src/sys/arch/i386/stand/lib/bootmenu.c	Sun Jun  5 13:33:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: bootmenu.c,v 1.14 2014/08/10 07:40:49 isaki Exp $	*/
+/*	$NetBSD: bootmenu.c,v 1.15 2016/06/05 13:33:03 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -178,7 +178,7 @@ doboottypemenu(void)
 				printf("\nOption: [%d]:",
 				    bootcfg_info.def + 1);
 
-			gets(input);
+			gets_s(input, sizeof(input));
 			choice = getchoicefrominput(input, bootcfg_info.def);
 		} else if (bootcfg_info.timeout == 0)
 			choice = bootcfg_info.def;

Index: src/sys/arch/i386/stand/lib/menuutils.c
diff -u src/sys/arch/i386/stand/lib/menuutils.c:1.4 src/sys/arch/i386/stand/lib/menuutils.c:1.5
--- src/sys/arch/i386/stand/lib/menuutils.c:1.4	Sun Apr  6 19:11:26 2014
+++ src/sys/arch/i386/stand/lib/menuutils.c	Sun Jun  5 13:33:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: menuutils.c,v 1.4 2014/04/06 19:11:26 jakllsch Exp $	*/
+/*	$NetBSD: menuutils.c,v 1.5 2016/06/05 13:33:03 maxv Exp $	*/
 
 /*
  * Copyright (c) 1996, 1997
@@ -71,7 +71,7 @@ bootmenu(void)
 
 		input[0] = '\0';
 		printf("> ");
-		gets(input);
+		gets_s(input, sizeof(input));
 
 		/*
 		 * Skip leading whitespace.

Index: src/sys/lib/libsa/gets.c
diff -u src/sys/lib/libsa/gets.c:1.10 src/sys/lib/libsa/gets.c:1.11
--- src/sys/lib/libsa/gets.c:1.10	Sat Nov 24 13:20:55 2007
+++ src/sys/lib/libsa/gets.c	Sun Jun  5 13:33:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: gets.c,v 1.10 2007/11/24 13:20:55 isaki Exp $	*/
+/*	$NetBSD: gets.c,v 1.11 2016/06/05 13:33:03 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -85,3 +85,61 @@ gets(char *buf)
 	}
 	/*NOTREACHED*/
 }
+
+void
+gets_s(char *buf, size_t size)
+{
+	int c;
+	char *lp;
+
+	for (lp = buf;;) {
+		if (lp - buf == size) {
+			lp--;
+			*lp = '\0';
+			return;
+		}
+		switch (c = getchar() & 0177) {
+		case '\n':
+		case '\r':
+			*lp = '\0';
+			putchar('\n');
+			return;
+		case '\b':
+		case '\177':
+			if (lp > buf) {
+				lp--;
+				putchar('\b');
+				putchar(' ');
+				putchar('\b');
+			}
+			break;
+#if HASH_ERASE
+		case '#':
+			if (lp > buf)
+				--lp;
+			break;
+#endif
+		case 'r' & 037: {
+			char *p;
+
+			putchar('\n');
+			for (p = buf; p < lp; ++p)
+				putchar(*p);
+			break;
+		}
+#if AT_ERASE
+		case '@':
+#endif
+		case 'u' & 037:
+		case 'w' & 037:
+			lp = buf;
+			putchar('\n');
+			break;
+		default:
+			*lp++ = c;
+			putchar(c);
+			break;
+		}
+	}
+	/*NOTREACHED*/
+}

Index: src/sys/lib/libsa/stand.h
diff -u src/sys/lib/libsa/stand.h:1.79 src/sys/lib/libsa/stand.h:1.80
--- src/sys/lib/libsa/stand.h:1.79	Sun Aug 10 07:40:49 2014
+++ src/sys/lib/libsa/stand.h	Sun Jun  5 13:33:03 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: stand.h,v 1.79 2014/08/10 07:40:49 isaki Exp $	*/
+/*	$NetBSD: stand.h,v 1.80 2016/06/05 13:33:03 maxv Exp $	*/
 
 /*
  * Copyright (c) 1999 Christopher G. Demetriou.  All rights reserved.
@@ -78,6 +78,7 @@
 #ifdef LIBSA_RENAME_PRINTF
 #define getchar		libsa_getchar
 #define gets		libsa_gets
+#define gets_s		libsa_gets_s
 #define printf		libsa_printf
 #define putchar		libsa_putchar
 #define vprintf		libsa_vprintf
@@ -258,6 +259,7 @@ int	vsnprintf(char *, size_t, const char
     __attribute__((__format__(__printf__, 3, 0)));
 void	twiddle(void);
 void	gets(char *);
+void	gets_s(char *, size_t);
 int	getfile(char *prompt, int mode);
 char	*strerror(int);
 __dead void	exit(int);

Reply via email to