diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2024-02-26 16:26:15 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2024-02-26 16:27:53 +0100 |
commit | c5a1be25ba6dd705382ce6c25d96a32f79974c04 (patch) | |
tree | 48b92a1b07b47329a2d48867ee5b7c11a84bea4a | |
parent | f873c63085e3f3745040286999779077ccc03987 (diff) | |
download | busybox-w32-c5a1be25ba6dd705382ce6c25d96a32f79974c04.tar.gz busybox-w32-c5a1be25ba6dd705382ce6c25d96a32f79974c04.tar.bz2 busybox-w32-c5a1be25ba6dd705382ce6c25d96a32f79974c04.zip |
ash: fix handling of single-quoted strings in pattern substitution
function old new delta
subevalvar 1576 1588 +12
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/ash.c | 5 | ||||
-rw-r--r-- | shell/ash_test/ash-quoting/dollar_repl_bash2.right | 4 | ||||
-rwxr-xr-x | shell/ash_test/ash-quoting/dollar_repl_bash2.tests | 8 | ||||
-rw-r--r-- | shell/hush_test/hush-quoting/dollar_repl_bash2.right | 4 | ||||
-rwxr-xr-x | shell/hush_test/hush-quoting/dollar_repl_bash2.tests | 8 |
5 files changed, 29 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index 771fc8bf9..4ca4c6c56 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -7073,6 +7073,11 @@ subevalvar(char *start, char *str, int strloc, | |||
7073 | repl = NULL; | 7073 | repl = NULL; |
7074 | break; | 7074 | break; |
7075 | } | 7075 | } |
7076 | /* Skip over quoted 'str'. Example: ${var/'/'} - second / is not a separator */ | ||
7077 | if ((unsigned char)*repl == CTLQUOTEMARK) { | ||
7078 | while ((unsigned char)*++repl != CTLQUOTEMARK) | ||
7079 | continue; | ||
7080 | } | ||
7076 | if (*repl == '/') { | 7081 | if (*repl == '/') { |
7077 | *repl = '\0'; | 7082 | *repl = '\0'; |
7078 | break; | 7083 | break; |
diff --git a/shell/ash_test/ash-quoting/dollar_repl_bash2.right b/shell/ash_test/ash-quoting/dollar_repl_bash2.right new file mode 100644 index 000000000..e3fcd5807 --- /dev/null +++ b/shell/ash_test/ash-quoting/dollar_repl_bash2.right | |||
@@ -0,0 +1,4 @@ | |||
1 | axxb | ||
2 | axxb | ||
3 | axxb | ||
4 | axxb | ||
diff --git a/shell/ash_test/ash-quoting/dollar_repl_bash2.tests b/shell/ash_test/ash-quoting/dollar_repl_bash2.tests new file mode 100755 index 000000000..45c7a10e2 --- /dev/null +++ b/shell/ash_test/ash-quoting/dollar_repl_bash2.tests | |||
@@ -0,0 +1,8 @@ | |||
1 | v="x/x" | ||
2 | # The second / is quoted, should not be treated as separator | ||
3 | echo a${v/'/'}b | ||
4 | # The second / is escaped, should not be treated as separator | ||
5 | echo a${v/\/}b | ||
6 | |||
7 | echo "a${v/'/'}b" | ||
8 | echo "a${v/\/}b" | ||
diff --git a/shell/hush_test/hush-quoting/dollar_repl_bash2.right b/shell/hush_test/hush-quoting/dollar_repl_bash2.right new file mode 100644 index 000000000..e3fcd5807 --- /dev/null +++ b/shell/hush_test/hush-quoting/dollar_repl_bash2.right | |||
@@ -0,0 +1,4 @@ | |||
1 | axxb | ||
2 | axxb | ||
3 | axxb | ||
4 | axxb | ||
diff --git a/shell/hush_test/hush-quoting/dollar_repl_bash2.tests b/shell/hush_test/hush-quoting/dollar_repl_bash2.tests new file mode 100755 index 000000000..45c7a10e2 --- /dev/null +++ b/shell/hush_test/hush-quoting/dollar_repl_bash2.tests | |||
@@ -0,0 +1,8 @@ | |||
1 | v="x/x" | ||
2 | # The second / is quoted, should not be treated as separator | ||
3 | echo a${v/'/'}b | ||
4 | # The second / is escaped, should not be treated as separator | ||
5 | echo a${v/\/}b | ||
6 | |||
7 | echo "a${v/'/'}b" | ||
8 | echo "a${v/\/}b" | ||