hush: fix handling of unterminated subshell: (<eof>. Fixes bug 229.

function                                             old     new   delta
syntax_error_unexpected_ch                            31      41     +10
parse_stream                                        2184    2191      +7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-05-02 17:18:34 +02:00
parent aa0a12d549
commit b1cfc45376

View File

@ -780,12 +780,12 @@ static void syntax_error_unterm_str(unsigned lineno, const char *s)
die_if_script(lineno, "syntax error: unterminated %s", s); die_if_script(lineno, "syntax error: unterminated %s", s);
} }
static void syntax_error_unexpected_ch(unsigned lineno, char ch) static void syntax_error_unexpected_ch(unsigned lineno, int ch)
{ {
char msg[2]; char msg[2];
msg[0] = ch; msg[0] = ch;
msg[1] = '\0'; msg[1] = '\0';
die_if_script(lineno, "syntax error: unexpected %s", msg); die_if_script(lineno, "syntax error: unexpected %s", ch == EOF ? "EOF" : msg);
} }
#if HUSH_DEBUG < 2 #if HUSH_DEBUG < 2
@ -5448,10 +5448,17 @@ static struct pipe *parse_stream(char **pstring,
if (heredoc_cnt) { if (heredoc_cnt) {
syntax_error_unterm_str("here document"); syntax_error_unterm_str("here document");
xfunc_die(); goto parse_error;
} }
/* end_trigger == '}' case errors out earlier,
* checking only ')' */
if (end_trigger == ')') {
syntax_error_unterm_ch('('); /* exits */
/* goto parse_error; */
}
if (done_word(&dest, &ctx)) { if (done_word(&dest, &ctx)) {
xfunc_die(); goto parse_error;
} }
o_free(&dest); o_free(&dest);
done_pipe(&ctx, PIPE_SEQ); done_pipe(&ctx, PIPE_SEQ);