← Commit list

f693b606b

Denys Vlasenko
Denys Vlasenko
2018-04-11
SUCCESS Duration: 146s

Subject

hush: fix recent breakage from parse_stream() changes

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash_test/ash-parsing/bkslash_newline3.right+1 -0
@@ -0,0 +1 @@
+a:[a]
shell/ash_test/ash-parsing/bkslash_newline3.tests+4 -0
@@ -0,0 +1,4 @@
+for s in \
+a; do
+ echo "a:[$s]"
+done
shell/hush.c+22 -22
@@ -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')
shell/hush_test/hush-parsing/bkslash_newline3.right+1 -0
@@ -0,0 +1 @@
+a:[a]
shell/hush_test/hush-parsing/bkslash_newline3.tests+4 -0
@@ -0,0 +1,4 @@
+for s in \
+a; do
+ echo "a:[$s]"
+done