hush: fix handling of \^C and "^C"

function                                             old     new   delta
parse_stream                                        2238    2252     +14
encode_string                                        243     256     +13
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 27/0)               Total: 27 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2021-06-15 16:05:57 +02:00
parent 04f052c56d
commit 1b7a9b68d0
9 changed files with 23 additions and 0 deletions

View File

@ -0,0 +1 @@
SHELL: line 1: : not found

View File

@ -0,0 +1,2 @@
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
$THIS_SH -c '\' SHELL

View File

@ -0,0 +1 @@
SHELL: line 1: -: not found

View File

@ -0,0 +1,2 @@
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
$THIS_SH -c '"-"' SHELL

View File

@ -5237,6 +5237,11 @@ static int encode_string(o_string *as_string,
}
#endif
o_addQchr(dest, ch);
if (ch == SPECIAL_VAR_SYMBOL) {
/* Convert "^C" to corresponding special variable reference */
o_addchr(dest, SPECIAL_VAR_QUOTED_SVS);
o_addchr(dest, SPECIAL_VAR_SYMBOL);
}
goto again;
#undef as_string
}
@ -5348,6 +5353,11 @@ static struct pipe *parse_stream(char **pstring,
if (ch == '\n')
continue; /* drop \<newline>, get next char */
nommu_addchr(&ctx.as_string, '\\');
if (ch == SPECIAL_VAR_SYMBOL) {
nommu_addchr(&ctx.as_string, ch);
/* Convert \^C to corresponding special variable reference */
goto case_SPECIAL_VAR_SYMBOL;
}
o_addchr(&ctx.word, '\\');
if (ch == EOF) {
/* Testcase: eval 'echo Ok\' */
@ -5672,6 +5682,7 @@ static struct pipe *parse_stream(char **pstring,
/* Note: nommu_addchr(&ctx.as_string, ch) is already done */
switch (ch) {
case_SPECIAL_VAR_SYMBOL:
case SPECIAL_VAR_SYMBOL:
/* Convert raw ^C to corresponding special variable reference */
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);

View File

@ -0,0 +1 @@
hush: can't execute '': No such file or directory

View File

@ -0,0 +1,2 @@
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
$THIS_SH -c '\' SHELL

View File

@ -0,0 +1 @@
hush: can't execute '-': No such file or directory

View File

@ -0,0 +1,2 @@
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
$THIS_SH -c '"-"' SHELL