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);