hush: fix a nommu bug where a part of function body is lost if run in a pipe

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2015-09-04 06:22:10 +02:00
parent 2156e22853
commit b5be13ccd9
3 changed files with 42 additions and 10 deletions

View File

@ -3161,11 +3161,29 @@ static int reserved_word(o_string *word, struct parse_context *ctx)
old->command->group = ctx->list_head; old->command->group = ctx->list_head;
old->command->cmd_type = CMD_NORMAL; old->command->cmd_type = CMD_NORMAL;
# if !BB_MMU # if !BB_MMU
o_addstr(&old->as_string, ctx->as_string.data); /* At this point, the compound command's string is in
o_free_unsafe(&ctx->as_string); * ctx->as_string... except for the leading keyword!
old->command->group_as_string = xstrdup(old->as_string.data); * Consider this example: "echo a | if true; then echo a; fi"
debug_printf_parse("pop, remembering as:'%s'\n", * ctx->as_string will contain "true; then echo a; fi",
old->command->group_as_string); * with "if " remaining in old->as_string!
*/
{
char *str;
int len = old->as_string.length;
/* Concatenate halves */
o_addstr(&old->as_string, ctx->as_string.data);
o_free_unsafe(&ctx->as_string);
/* Find where leading keyword starts in first half */
str = old->as_string.data + len;
if (str > old->as_string.data)
str--; /* skip whitespace after keyword */
while (str > old->as_string.data && isalpha(str[-1]))
str--;
/* Ugh, we're done with this horrid hack */
old->command->group_as_string = xstrdup(str);
debug_printf_parse("pop, remembering as:'%s'\n",
old->command->group_as_string);
}
# endif # endif
*ctx = *old; /* physical copy */ *ctx = *old; /* physical copy */
free(old); free(old);
@ -4248,7 +4266,7 @@ static struct pipe *parse_stream(char **pstring,
pi = NULL; pi = NULL;
} }
#if !BB_MMU #if !BB_MMU
debug_printf_parse("as_string '%s'\n", ctx.as_string.data); debug_printf_parse("as_string1 '%s'\n", ctx.as_string.data);
if (pstring) if (pstring)
*pstring = ctx.as_string.data; *pstring = ctx.as_string.data;
else else
@ -4399,7 +4417,7 @@ static struct pipe *parse_stream(char **pstring,
) { ) {
o_free(&dest); o_free(&dest);
#if !BB_MMU #if !BB_MMU
debug_printf_parse("as_string '%s'\n", ctx.as_string.data); debug_printf_parse("as_string2 '%s'\n", ctx.as_string.data);
if (pstring) if (pstring)
*pstring = ctx.as_string.data; *pstring = ctx.as_string.data;
else else
@ -4639,9 +4657,6 @@ static struct pipe *parse_stream(char **pstring,
* with redirect_opt_num(), but bash doesn't do it. * with redirect_opt_num(), but bash doesn't do it.
* "echo foo 2| cat" yields "foo 2". */ * "echo foo 2| cat" yields "foo 2". */
done_command(&ctx); done_command(&ctx);
#if !BB_MMU
o_reset_to_empty_unquoted(&ctx.as_string);
#endif
} }
goto new_cmd; goto new_cmd;
case '(': case '(':

View File

@ -0,0 +1,2 @@
Ok
0

View File

@ -0,0 +1,15 @@
#!/bin/sh
func()
{
while read p; do echo "$p"; done
}
pipe_to_func()
{
# We had a NOMMU bug which caused "echo Ok |" part ot be lost
echo Ok | func
}
pipe_to_func | cat
echo $?