From 3675c37b9b0bb4ba565b690b95b0b9c7d0ce8123 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 23 Jul 2018 16:31:21 +0200 Subject: [PATCH] hush: fix heredoc handling in the "cmd <" case function old new delta parse_stream 2759 2787 +28 Signed-off-by: Denys Vlasenko --- shell/ash_test/ash-heredoc/heredocA.right | 1 + shell/ash_test/ash-heredoc/heredocA.tests | 4 ++ shell/hush.c | 54 ++++++++++++--------- shell/hush_test/hush-heredoc/heredoc9.right | 1 + shell/hush_test/hush-heredoc/heredoc9.tests | 9 ++++ shell/hush_test/hush-heredoc/heredocA.right | 1 + shell/hush_test/hush-heredoc/heredocA.tests | 4 ++ 7 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 shell/ash_test/ash-heredoc/heredocA.right create mode 100755 shell/ash_test/ash-heredoc/heredocA.tests create mode 100644 shell/hush_test/hush-heredoc/heredoc9.right create mode 100755 shell/hush_test/hush-heredoc/heredoc9.tests create mode 100644 shell/hush_test/hush-heredoc/heredocA.right create mode 100755 shell/hush_test/hush-heredoc/heredocA.tests diff --git a/shell/ash_test/ash-heredoc/heredocA.right b/shell/ash_test/ash-heredoc/heredocA.right new file mode 100644 index 000000000..7326d9603 --- /dev/null +++ b/shell/ash_test/ash-heredoc/heredocA.right @@ -0,0 +1 @@ +Ok diff --git a/shell/ash_test/ash-heredoc/heredocA.tests b/shell/ash_test/ash-heredoc/heredocA.tests new file mode 100755 index 000000000..440aaf906 --- /dev/null +++ b/shell/ash_test/ash-heredoc/heredocA.tests @@ -0,0 +1,4 @@ +{ cat <cmds; - debug_printf_parse("fetch_heredocs: num_cmds:%d cmd argv0:'%s'\n", + debug_printf_heredoc("fetch_heredocs: num_cmds:%d cmd argv0:'%s'\n", pi->num_cmds, - cmd->argv ? cmd->argv[0] : "NONE"); + cmd->argv ? cmd->argv[0] : "NONE" + ); for (i = 0; i < pi->num_cmds; i++) { struct redir_struct *redir = cmd->redirects; - debug_printf_parse("fetch_heredocs: %d cmd argv0:'%s'\n", + debug_printf_heredoc("fetch_heredocs: %d cmd argv0:'%s'\n", i, cmd->argv ? cmd->argv[0] : "NONE"); while (redir) { if (redir->rd_type == REDIRECT_HEREDOC) { @@ -4325,11 +4331,9 @@ static int fetch_heredocs(int heredoc_cnt, struct parse_context *ctx, struct in_ } pi = pi->next; } -#if 0 /* Should be 0. If it isn't, it's a parse error */ - if (heredoc_cnt) + if (HUSH_DEBUG && heredoc_cnt) bb_error_msg_and_die("heredoc BUG 2"); -#endif return 0; } @@ -5200,7 +5204,9 @@ static struct pipe *parse_stream(char **pstring, * "case ... in word) ..." */ if (IS_NULL_CMD(ctx.command) - && ctx.word.length == 0 && !ctx.word.has_quoted_part + && ctx.word.length == 0 + && !ctx.word.has_quoted_part + && heredoc_cnt == 0 ) { /* This newline can be ignored. But... * Without check #1, interactive shell @@ -5228,7 +5234,7 @@ static struct pipe *parse_stream(char **pstring, } /* Treat newline as a command separator. */ done_pipe(&ctx, PIPE_SEQ); - debug_printf_parse("heredoc_cnt:%d\n", heredoc_cnt); + debug_printf_heredoc("heredoc_cnt:%d\n", heredoc_cnt); if (heredoc_cnt) { if (fetch_heredocs(heredoc_cnt, &ctx, input)) { goto parse_error; @@ -5362,7 +5368,7 @@ static struct pipe *parse_stream(char **pstring, if (next == '<') { redir_style = REDIRECT_HEREDOC; heredoc_cnt++; - debug_printf_parse("++heredoc_cnt=%d\n", heredoc_cnt); + debug_printf_heredoc("++heredoc_cnt=%d\n", heredoc_cnt); ch = i_getch(input); nommu_addchr(&ctx.as_string, ch); } else if (next == '>') { diff --git a/shell/hush_test/hush-heredoc/heredoc9.right b/shell/hush_test/hush-heredoc/heredoc9.right new file mode 100644 index 000000000..ce0136250 --- /dev/null +++ b/shell/hush_test/hush-heredoc/heredoc9.right @@ -0,0 +1 @@ +hello diff --git a/shell/hush_test/hush-heredoc/heredoc9.tests b/shell/hush_test/hush-heredoc/heredoc9.tests new file mode 100755 index 000000000..96c227cc1 --- /dev/null +++ b/shell/hush_test/hush-heredoc/heredoc9.tests @@ -0,0 +1,9 @@ +echo hello >greeting +cat </dev/null +rm greeting diff --git a/shell/hush_test/hush-heredoc/heredocA.right b/shell/hush_test/hush-heredoc/heredocA.right new file mode 100644 index 000000000..7326d9603 --- /dev/null +++ b/shell/hush_test/hush-heredoc/heredocA.right @@ -0,0 +1 @@ +Ok diff --git a/shell/hush_test/hush-heredoc/heredocA.tests b/shell/hush_test/hush-heredoc/heredocA.tests new file mode 100755 index 000000000..440aaf906 --- /dev/null +++ b/shell/hush_test/hush-heredoc/heredocA.tests @@ -0,0 +1,4 @@ +{ cat <