Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
From c5a1be25ba6dd705382ce6c25d96a32f79974c04 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Mon, 26 Feb 2024 16:26:15 +0100
Subject: [PATCH] ash: fix handling of single-quoted strings in pattern
substitution
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
function old new delta
subevalvar 1576 1588 +12
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Signed-off-by: Sören Tempel <soeren+git@soeren-tempel.net>
---
shell/ash.c | 5 +++++
shell/ash_test/ash-quoting/dollar_repl_bash2.right | 4 ++++
shell/ash_test/ash-quoting/dollar_repl_bash2.tests | 8 ++++++++
shell/hush_test/hush-quoting/dollar_repl_bash2.right | 4 ++++
shell/hush_test/hush-quoting/dollar_repl_bash2.tests | 8 ++++++++
5 files changed, 29 insertions(+)
create mode 100644 shell/ash_test/ash-quoting/dollar_repl_bash2.right
create mode 100755 shell/ash_test/ash-quoting/dollar_repl_bash2.tests
create mode 100644 shell/hush_test/hush-quoting/dollar_repl_bash2.right
create mode 100755 shell/hush_test/hush-quoting/dollar_repl_bash2.tests
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,
repl = NULL;
break;
}
+ /* Skip over quoted 'str'. Example: ${var/'/'} - second / is not a separator */
+ if ((unsigned char)*repl == CTLQUOTEMARK) {
+ while ((unsigned char)*++repl != CTLQUOTEMARK)
+ continue;
+ }
if (*repl == '/') {
*repl = '\0';
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 @@
+axxb
+axxb
+axxb
+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 @@
+v="x/x"
+# The second / is quoted, should not be treated as separator
+echo a${v/'/'}b
+# The second / is escaped, should not be treated as separator
+echo a${v/\/}b
+
+echo "a${v/'/'}b"
+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 @@
+axxb
+axxb
+axxb
+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 @@
+v="x/x"
+# The second / is quoted, should not be treated as separator
+echo a${v/'/'}b
+# The second / is escaped, should not be treated as separator
+echo a${v/\/}b
+
+echo "a${v/'/'}b"
+echo "a${v/\/}b"