Skip to content
Snippets Groups Projects
0035-ash-fix-handling-of-single-quoted-strings-in-pattern.patch 3.13 KiB
Newer Older
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"