diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-15 16:05:57 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-11-23 05:31:30 +0100 |
commit | 56a335378ac100d51c30b21eee499a2effa37fba (patch) | |
tree | ac77b70f346a03a43ae7219be5b9704788d4d624 | |
parent | 5b939a6d290651bcd836083d2a3e6fa6ff7bc636 (diff) | |
download | busybox-w32-56a335378ac100d51c30b21eee499a2effa37fba.tar.gz busybox-w32-56a335378ac100d51c30b21eee499a2effa37fba.tar.bz2 busybox-w32-56a335378ac100d51c30b21eee499a2effa37fba.zip |
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>
(cherry picked from commit 1b7a9b68d0e9aa19147d7fda16eb9a6b54156985)
-rw-r--r-- | shell/ash_test/ash-misc/control_char3.right | 1 | ||||
-rwxr-xr-x | shell/ash_test/ash-misc/control_char3.tests | 2 | ||||
-rw-r--r-- | shell/ash_test/ash-misc/control_char4.right | 1 | ||||
-rwxr-xr-x | shell/ash_test/ash-misc/control_char4.tests | 2 | ||||
-rw-r--r-- | shell/hush.c | 11 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/control_char3.right | 1 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/control_char3.tests | 2 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/control_char4.right | 1 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/control_char4.tests | 2 |
9 files changed, 23 insertions, 0 deletions
diff --git a/shell/ash_test/ash-misc/control_char3.right b/shell/ash_test/ash-misc/control_char3.right new file mode 100644 index 000000000..283e02cbb --- /dev/null +++ b/shell/ash_test/ash-misc/control_char3.right | |||
@@ -0,0 +1 @@ | |||
SHELL: line 1: : not found | |||
diff --git a/shell/ash_test/ash-misc/control_char3.tests b/shell/ash_test/ash-misc/control_char3.tests new file mode 100755 index 000000000..4359db3f3 --- /dev/null +++ b/shell/ash_test/ash-misc/control_char3.tests | |||
@@ -0,0 +1,2 @@ | |||
1 | # (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) | ||
2 | $THIS_SH -c '\' SHELL | ||
diff --git a/shell/ash_test/ash-misc/control_char4.right b/shell/ash_test/ash-misc/control_char4.right new file mode 100644 index 000000000..2bf18e684 --- /dev/null +++ b/shell/ash_test/ash-misc/control_char4.right | |||
@@ -0,0 +1 @@ | |||
SHELL: line 1: -: not found | |||
diff --git a/shell/ash_test/ash-misc/control_char4.tests b/shell/ash_test/ash-misc/control_char4.tests new file mode 100755 index 000000000..48010f154 --- /dev/null +++ b/shell/ash_test/ash-misc/control_char4.tests | |||
@@ -0,0 +1,2 @@ | |||
1 | # (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) | ||
2 | $THIS_SH -c '"-"' SHELL | ||
diff --git a/shell/hush.c b/shell/hush.c index 9fead37da..249728b9d 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -5235,6 +5235,11 @@ static int encode_string(o_string *as_string, | |||
5235 | } | 5235 | } |
5236 | #endif | 5236 | #endif |
5237 | o_addQchr(dest, ch); | 5237 | o_addQchr(dest, ch); |
5238 | if (ch == SPECIAL_VAR_SYMBOL) { | ||
5239 | /* Convert "^C" to corresponding special variable reference */ | ||
5240 | o_addchr(dest, SPECIAL_VAR_QUOTED_SVS); | ||
5241 | o_addchr(dest, SPECIAL_VAR_SYMBOL); | ||
5242 | } | ||
5238 | goto again; | 5243 | goto again; |
5239 | #undef as_string | 5244 | #undef as_string |
5240 | } | 5245 | } |
@@ -5346,6 +5351,11 @@ static struct pipe *parse_stream(char **pstring, | |||
5346 | if (ch == '\n') | 5351 | if (ch == '\n') |
5347 | continue; /* drop \<newline>, get next char */ | 5352 | continue; /* drop \<newline>, get next char */ |
5348 | nommu_addchr(&ctx.as_string, '\\'); | 5353 | nommu_addchr(&ctx.as_string, '\\'); |
5354 | if (ch == SPECIAL_VAR_SYMBOL) { | ||
5355 | nommu_addchr(&ctx.as_string, ch); | ||
5356 | /* Convert \^C to corresponding special variable reference */ | ||
5357 | goto case_SPECIAL_VAR_SYMBOL; | ||
5358 | } | ||
5349 | o_addchr(&ctx.word, '\\'); | 5359 | o_addchr(&ctx.word, '\\'); |
5350 | if (ch == EOF) { | 5360 | if (ch == EOF) { |
5351 | /* Testcase: eval 'echo Ok\' */ | 5361 | /* Testcase: eval 'echo Ok\' */ |
@@ -5670,6 +5680,7 @@ static struct pipe *parse_stream(char **pstring, | |||
5670 | /* Note: nommu_addchr(&ctx.as_string, ch) is already done */ | 5680 | /* Note: nommu_addchr(&ctx.as_string, ch) is already done */ |
5671 | 5681 | ||
5672 | switch (ch) { | 5682 | switch (ch) { |
5683 | case_SPECIAL_VAR_SYMBOL: | ||
5673 | case SPECIAL_VAR_SYMBOL: | 5684 | case SPECIAL_VAR_SYMBOL: |
5674 | /* Convert raw ^C to corresponding special variable reference */ | 5685 | /* Convert raw ^C to corresponding special variable reference */ |
5675 | o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); | 5686 | o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); |
diff --git a/shell/hush_test/hush-misc/control_char3.right b/shell/hush_test/hush-misc/control_char3.right new file mode 100644 index 000000000..94b4f8699 --- /dev/null +++ b/shell/hush_test/hush-misc/control_char3.right | |||
@@ -0,0 +1 @@ | |||
hush: can't execute '': No such file or directory | |||
diff --git a/shell/hush_test/hush-misc/control_char3.tests b/shell/hush_test/hush-misc/control_char3.tests new file mode 100755 index 000000000..4359db3f3 --- /dev/null +++ b/shell/hush_test/hush-misc/control_char3.tests | |||
@@ -0,0 +1,2 @@ | |||
1 | # (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) | ||
2 | $THIS_SH -c '\' SHELL | ||
diff --git a/shell/hush_test/hush-misc/control_char4.right b/shell/hush_test/hush-misc/control_char4.right new file mode 100644 index 000000000..698e21427 --- /dev/null +++ b/shell/hush_test/hush-misc/control_char4.right | |||
@@ -0,0 +1 @@ | |||
hush: can't execute '-': No such file or directory | |||
diff --git a/shell/hush_test/hush-misc/control_char4.tests b/shell/hush_test/hush-misc/control_char4.tests new file mode 100755 index 000000000..48010f154 --- /dev/null +++ b/shell/hush_test/hush-misc/control_char4.tests | |||
@@ -0,0 +1,2 @@ | |||
1 | # (set argv0 to "SHELL" to avoid "/path/to/shell: blah" in error messages) | ||
2 | $THIS_SH -c '"-"' SHELL | ||