aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-06-15 16:05:57 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-06-15 16:46:30 +0200
commit1b7a9b68d0e9aa19147d7fda16eb9a6b54156985 (patch)
tree5e35a487488b39a21b2d81cc2805d4241cbb5a8e
parent04f052c56ded5ab6a904e3a264a73dc0412b2e78 (diff)
downloadbusybox-w32-1b7a9b68d0e9aa19147d7fda16eb9a6b54156985.tar.gz
busybox-w32-1b7a9b68d0e9aa19147d7fda16eb9a6b54156985.tar.bz2
busybox-w32-1b7a9b68d0e9aa19147d7fda16eb9a6b54156985.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>
-rw-r--r--shell/ash_test/ash-misc/control_char3.right1
-rwxr-xr-xshell/ash_test/ash-misc/control_char3.tests2
-rw-r--r--shell/ash_test/ash-misc/control_char4.right1
-rwxr-xr-xshell/ash_test/ash-misc/control_char4.tests2
-rw-r--r--shell/hush.c11
-rw-r--r--shell/hush_test/hush-misc/control_char3.right1
-rwxr-xr-xshell/hush_test/hush-misc/control_char3.tests2
-rw-r--r--shell/hush_test/hush-misc/control_char4.right1
-rwxr-xr-xshell/hush_test/hush-misc/control_char4.tests2
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 741f93589..e271c04d6 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -5237,6 +5237,11 @@ static int encode_string(o_string *as_string,
5237 } 5237 }
5238#endif 5238#endif
5239 o_addQchr(dest, ch); 5239 o_addQchr(dest, ch);
5240 if (ch == SPECIAL_VAR_SYMBOL) {
5241 /* Convert "^C" to corresponding special variable reference */
5242 o_addchr(dest, SPECIAL_VAR_QUOTED_SVS);
5243 o_addchr(dest, SPECIAL_VAR_SYMBOL);
5244 }
5240 goto again; 5245 goto again;
5241#undef as_string 5246#undef as_string
5242} 5247}
@@ -5348,6 +5353,11 @@ static struct pipe *parse_stream(char **pstring,
5348 if (ch == '\n') 5353 if (ch == '\n')
5349 continue; /* drop \<newline>, get next char */ 5354 continue; /* drop \<newline>, get next char */
5350 nommu_addchr(&ctx.as_string, '\\'); 5355 nommu_addchr(&ctx.as_string, '\\');
5356 if (ch == SPECIAL_VAR_SYMBOL) {
5357 nommu_addchr(&ctx.as_string, ch);
5358 /* Convert \^C to corresponding special variable reference */
5359 goto case_SPECIAL_VAR_SYMBOL;
5360 }
5351 o_addchr(&ctx.word, '\\'); 5361 o_addchr(&ctx.word, '\\');
5352 if (ch == EOF) { 5362 if (ch == EOF) {
5353 /* Testcase: eval 'echo Ok\' */ 5363 /* Testcase: eval 'echo Ok\' */
@@ -5672,6 +5682,7 @@ static struct pipe *parse_stream(char **pstring,
5672 /* Note: nommu_addchr(&ctx.as_string, ch) is already done */ 5682 /* Note: nommu_addchr(&ctx.as_string, ch) is already done */
5673 5683
5674 switch (ch) { 5684 switch (ch) {
5685 case_SPECIAL_VAR_SYMBOL:
5675 case SPECIAL_VAR_SYMBOL: 5686 case SPECIAL_VAR_SYMBOL:
5676 /* Convert raw ^C to corresponding special variable reference */ 5687 /* Convert raw ^C to corresponding special variable reference */
5677 o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); 5688 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