diff options
Diffstat (limited to 'shell/hush.c')
| -rw-r--r-- | shell/hush.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c index 8aa923e2e..226a6d68f 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -4469,7 +4469,12 @@ static int done_word(struct parse_context *ctx) } else # endif /* Is it a place where keyword can appear? */ - if (!command->argv /* if it's the first word of command... */ +//FIXME: this is wrong, it allows invalid syntax: { echo t; } if true; then echo YES; fi + if ((!command->argv /* if it's the first word of command... */ +# if ENABLE_HUSH_FUNCTIONS + || command->cmd_type == CMD_FUNCDEF /* ^^^ or after FUNC() {} */ +# endif + ) && !ctx->word.has_quoted_part /* ""WORD never matches any keywords */ && !command->redirects /* no redirects yet... disallows: </dev/null if true; then... */ # if ENABLE_HUSH_LOOPS @@ -6067,7 +6072,11 @@ static struct pipe *parse_stream(char **pstring, } else #endif /* Are { and } special here? */ - if (ctx.command->argv /* WORD [WORD]{... - non-special */ + if ((ctx.command->argv /* WORD [WORD]{... - non-special */ +#if ENABLE_HUSH_FUNCTIONS + && ctx.command->cmd_type != CMD_FUNCDEF /* ^^^ unless FUNC() {} */ +#endif + ) || !IS_NULL_WORD(ctx.word) /* WORD{... ""{... - non-special */ || (next != ';' /* }; - special */ && next != ')' /* }) - special */ |
