diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/input.c | 6 | ||||
-rw-r--r-- | Src/lex.c | 6 |
3 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index b5fc3a7f7..5307eaa6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-02-14 Barton E. Schaefer <schaefer@zsh.org> + + * 34543: Src/input.c, Src/lex.c: Fix crash on garbage bytes + inside $(...) + 2015-02-14 Mikael Magnusson <mikachu@gmail.com> * unposted: Doc/Zsh/prompt.yo: Fix typo from 28487. diff --git a/Src/input.c b/Src/input.c index 2ecac7bdc..9520fdd6d 100644 --- a/Src/input.c +++ b/Src/input.c @@ -393,12 +393,14 @@ inungetc(int c) if (((inbufflags & INP_LINENO) || !strin) && c == '\n') lineno--; } -#ifdef DEBUG else if (!(inbufflags & INP_CONT)) { +#ifdef DEBUG /* Just for debugging */ fprintf(stderr, "Attempt to inungetc() at start of input.\n"); - } #endif + zerr("Garbled input at %c (binary file as commands?)", c); + return; + } else { /* * The character is being backed up from a previous input stack diff --git a/Src/lex.c b/Src/lex.c index 433c27fbb..91628d4c2 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -503,13 +503,15 @@ cmd_or_math(int cs_type) /* else unsuccessful: unget the whole thing */ hungetc(c); lexstop = 0; - while (lexbuf.len > oldlen) { + while (lexbuf.len > oldlen && !errflag) { lexbuf.len--; hungetc(itok(*--lexbuf.ptr) ? ztokens[*lexbuf.ptr - Pound] : *lexbuf.ptr); } + if (errflag) + return 2; hungetc('('); - return 0; + return errflag ? 2 : 0; } |