hush: fix recent breakage from parse_stream() changes
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Apr 2018 18:00:43 +0000 (20:00 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Apr 2018 18:00:43 +0000 (20:00 +0200)
function                                             old     new   delta
parse_stream                                        3808    3821     +13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash_test/ash-parsing/bkslash_newline3.right [new file with mode: 0644]
shell/ash_test/ash-parsing/bkslash_newline3.tests [new file with mode: 0755]
shell/hush.c
shell/hush_test/hush-parsing/bkslash_newline3.right [new file with mode: 0644]
shell/hush_test/hush-parsing/bkslash_newline3.tests [new file with mode: 0755]

diff --git a/shell/ash_test/ash-parsing/bkslash_newline3.right b/shell/ash_test/ash-parsing/bkslash_newline3.right
new file mode 100644 (file)
index 0000000..e635074
--- /dev/null
@@ -0,0 +1 @@
+a:[a]
diff --git a/shell/ash_test/ash-parsing/bkslash_newline3.tests b/shell/ash_test/ash-parsing/bkslash_newline3.tests
new file mode 100755 (executable)
index 0000000..2accd43
--- /dev/null
@@ -0,0 +1,4 @@
+for s in       \
+a; do
+       echo "a:[$s]"
+done
index 8e95a26a606b4365f797808b59c20e30d5d8cc46..c7770017502108f8f9f6b847e89c3dd8b17a09ac 100644 (file)
@@ -5075,7 +5075,6 @@ static struct pipe *parse_stream(char **pstring,
                        debug_printf_parse("parse_stream return %p\n", pi);
                        return pi;
                }
-               nommu_addchr(&ctx.as_string, ch);
 
                /* Handle "'" and "\" first, as they won't play nice with
                 * i_peek_and_eat_bkslash_nl() anyway:
@@ -5085,6 +5084,28 @@ static struct pipe *parse_stream(char **pstring,
                 *   '
                 * would break.
                 */
+               if (ch == '\\') {
+                       ch = i_getch(input);
+                       if (ch == '\n')
+                               continue; /* drop \<newline>, get next char */
+                       nommu_addchr(&ctx.as_string, '\\');
+                       o_addchr(&ctx.word, '\\');
+                       if (ch == EOF) {
+                               /* Testcase: eval 'echo Ok\' */
+                               /* bash-4.3.43 was removing backslash,
+                                * but 4.4.19 retains it, most other shells too
+                                */
+                               continue; /* get next char */
+                       }
+                       /* Example: echo Hello \2>file
+                        * we need to know that word 2 is quoted
+                        */
+                       ctx.word.has_quoted_part = 1;
+                       nommu_addchr(&ctx.as_string, ch);
+                       o_addchr(&ctx.word, ch);
+                       continue; /* get next char */
+               }
+               nommu_addchr(&ctx.as_string, ch);
                if (ch == '\'') {
                        ctx.word.has_quoted_part = 1;
                        next = i_getch(input);
@@ -5110,27 +5131,6 @@ static struct pipe *parse_stream(char **pstring,
                        }
                        continue; /* get next char */
                }
-               if (ch == '\\') {
-                       /*nommu_addchr(&ctx.as_string, '\\'); - already done */
-                       o_addchr(&ctx.word, '\\');
-                       ch = i_getch(input);
-                       if (ch == EOF) {
-                               /* Testcase: eval 'echo Ok\' */
-
-#if 0 /* bash-4.3.43 was removing backslash, but 4.4.19 retains it, most other shells too */
-                               /* Remove trailing '\' from ctx.as_string */
-                               ctx.as_string.data[--ctx.as_string.length] = '\0';
-#endif
-                               continue; /* get next char */
-                       }
-                       /* Example: echo Hello \2>file
-                        * we need to know that word 2 is quoted
-                        */
-                       ctx.word.has_quoted_part = 1;
-                       nommu_addchr(&ctx.as_string, ch);
-                       o_addchr(&ctx.word, ch);
-                       continue; /* get next char */
-               }
 
                next = '\0';
                if (ch != '\n')
diff --git a/shell/hush_test/hush-parsing/bkslash_newline3.right b/shell/hush_test/hush-parsing/bkslash_newline3.right
new file mode 100644 (file)
index 0000000..e635074
--- /dev/null
@@ -0,0 +1 @@
+a:[a]
diff --git a/shell/hush_test/hush-parsing/bkslash_newline3.tests b/shell/hush_test/hush-parsing/bkslash_newline3.tests
new file mode 100755 (executable)
index 0000000..2accd43
--- /dev/null
@@ -0,0 +1,4 @@
+for s in       \
+a; do
+       echo "a:[$s]"
+done