hush: fix recent breakage from parse_stream() changes
function old new delta parse_stream 3808 3821 +13 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
44257ad5d0
commit
f693b606b7
1
shell/ash_test/ash-parsing/bkslash_newline3.right
Normal file
1
shell/ash_test/ash-parsing/bkslash_newline3.right
Normal file
@ -0,0 +1 @@
|
||||
a:[a]
|
4
shell/ash_test/ash-parsing/bkslash_newline3.tests
Executable file
4
shell/ash_test/ash-parsing/bkslash_newline3.tests
Executable file
@ -0,0 +1,4 @@
|
||||
for s in \
|
||||
a; do
|
||||
echo "a:[$s]"
|
||||
done
|
44
shell/hush.c
44
shell/hush.c
@ -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')
|
||||
|
1
shell/hush_test/hush-parsing/bkslash_newline3.right
Normal file
1
shell/hush_test/hush-parsing/bkslash_newline3.right
Normal file
@ -0,0 +1 @@
|
||||
a:[a]
|
4
shell/hush_test/hush-parsing/bkslash_newline3.tests
Executable file
4
shell/hush_test/hush-parsing/bkslash_newline3.tests
Executable file
@ -0,0 +1,4 @@
|
||||
for s in \
|
||||
a; do
|
||||
echo "a:[$s]"
|
||||
done
|
Loading…
Reference in New Issue
Block a user