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:
parent
04f052c56d
commit
1b7a9b68d0
1
shell/ash_test/ash-misc/control_char3.right
Normal file
1
shell/ash_test/ash-misc/control_char3.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
SHELL: line 1: : not found
|
2
shell/ash_test/ash-misc/control_char3.tests
Executable file
2
shell/ash_test/ash-misc/control_char3.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
|
||||||
|
$THIS_SH -c '\' SHELL
|
1
shell/ash_test/ash-misc/control_char4.right
Normal file
1
shell/ash_test/ash-misc/control_char4.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
SHELL: line 1: -: not found
|
2
shell/ash_test/ash-misc/control_char4.tests
Executable file
2
shell/ash_test/ash-misc/control_char4.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
|
||||||
|
$THIS_SH -c '"-"' SHELL
|
11
shell/hush.c
11
shell/hush.c
@ -5237,6 +5237,11 @@ static int encode_string(o_string *as_string,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
o_addQchr(dest, ch);
|
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;
|
goto again;
|
||||||
#undef as_string
|
#undef as_string
|
||||||
}
|
}
|
||||||
@ -5348,6 +5353,11 @@ static struct pipe *parse_stream(char **pstring,
|
|||||||
if (ch == '\n')
|
if (ch == '\n')
|
||||||
continue; /* drop \<newline>, get next char */
|
continue; /* drop \<newline>, get next char */
|
||||||
nommu_addchr(&ctx.as_string, '\\');
|
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, '\\');
|
o_addchr(&ctx.word, '\\');
|
||||||
if (ch == EOF) {
|
if (ch == EOF) {
|
||||||
/* Testcase: eval 'echo Ok\' */
|
/* 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 */
|
/* Note: nommu_addchr(&ctx.as_string, ch) is already done */
|
||||||
|
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
|
case_SPECIAL_VAR_SYMBOL:
|
||||||
case SPECIAL_VAR_SYMBOL:
|
case SPECIAL_VAR_SYMBOL:
|
||||||
/* Convert raw ^C to corresponding special variable reference */
|
/* Convert raw ^C to corresponding special variable reference */
|
||||||
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
|
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
|
||||||
|
1
shell/hush_test/hush-misc/control_char3.right
Normal file
1
shell/hush_test/hush-misc/control_char3.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
hush: can't execute '': No such file or directory
|
2
shell/hush_test/hush-misc/control_char3.tests
Executable file
2
shell/hush_test/hush-misc/control_char3.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
|
||||||
|
$THIS_SH -c '\' SHELL
|
1
shell/hush_test/hush-misc/control_char4.right
Normal file
1
shell/hush_test/hush-misc/control_char4.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
hush: can't execute '-': No such file or directory
|
2
shell/hush_test/hush-misc/control_char4.tests
Executable file
2
shell/hush_test/hush-misc/control_char4.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
# (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages)
|
||||||
|
$THIS_SH -c '"-"' SHELL
|
Loading…
x
Reference in New Issue
Block a user