diff options
| author | Kyle Evans <kevans@FreeBSD.org> | 2020-04-07 14:14:59 +0000 |
|---|---|---|
| committer | Kyle Evans <kevans@FreeBSD.org> | 2020-04-07 14:14:59 +0000 |
| commit | 610acef53890d37b531111ea29fb083aae843453 (patch) | |
| tree | ddc669d0e91c8726f7824a32883f7d236a80e9eb /usr.sbin/config | |
| parent | ed648b3f3984ec27ae5411eee7fe29153e966a16 (diff) | |
Notes
Diffstat (limited to 'usr.sbin/config')
| -rw-r--r-- | usr.sbin/config/main.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c index ba5c54bce3a9..a7204982f998 100644 --- a/usr.sbin/config/main.c +++ b/usr.sbin/config/main.c @@ -322,7 +322,7 @@ usage(void) char * get_word(FILE *fp) { - static char line[80]; + static char line[160]; int ch; char *cp; int escaped_nl = 0; @@ -352,11 +352,17 @@ begin: *cp = 0; return (line); } - while ((ch = getc(fp)) != EOF) { + while ((ch = getc(fp)) != EOF && cp < line + sizeof(line)) { if (isspace(ch)) break; *cp++ = ch; } + if (cp >= line + sizeof(line)) { + line[sizeof(line) - 1] = '\0'; + fprintf(stderr, "config: attempted overflow, partial line: `%s'", + line); + exit(2); + } *cp = 0; if (ch == EOF) return ((char *)EOF); @@ -372,7 +378,7 @@ begin: char * get_quoted_word(FILE *fp) { - static char line[256]; + static char line[512]; int ch; char *cp; int escaped_nl = 0; @@ -415,16 +421,30 @@ begin: } if (ch != quote && escaped_nl) *cp++ = '\\'; + if (cp >= line + sizeof(line)) { + line[sizeof(line) - 1] = '\0'; + printf( + "config: line buffer overflow reading partial line `%s'\n", + line); + exit(2); + } *cp++ = ch; escaped_nl = 0; } } else { *cp++ = ch; - while ((ch = getc(fp)) != EOF) { + while ((ch = getc(fp)) != EOF && cp < line + sizeof(line)) { if (isspace(ch)) break; *cp++ = ch; } + if (cp >= line + sizeof(line)) { + line[sizeof(line) - 1] = '\0'; + printf( + "config: line buffer overflow reading partial line `%s'\n", + line); + exit(2); + } if (ch != EOF) (void) ungetc(ch, fp); } |
