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:
parent
2156e22853
commit
b5be13ccd9
35
shell/hush.c
35
shell/hush.c
@ -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 '(':
|
||||||
|
2
shell/hush_test/hush-misc/nommu3.right
Normal file
2
shell/hush_test/hush-misc/nommu3.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Ok
|
||||||
|
0
|
15
shell/hush_test/hush-misc/nommu3.tests
Executable file
15
shell/hush_test/hush-misc/nommu3.tests
Executable 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 $?
|
Loading…
x
Reference in New Issue
Block a user