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