summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/unit.c15
-rw-r--r--src/test/test-core-unit.c10
2 files changed, 17 insertions, 8 deletions
diff --git a/src/core/unit.c b/src/core/unit.c
index 846d15b415..2d47d9de8c 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -4332,10 +4332,17 @@ const char* unit_escape_setting(const char *s, UnitWriteFlags flags, char **buf)
}
/* We either do C-escaping or shell-escaping, to additionally escape characters that we parse for
- * ExecStart= and friends, i.e. '$' and ';' and quotes. */
+ * ExecStart= and friends, i.e. '$' and quotes. */
if (flags & UNIT_ESCAPE_EXEC_SYNTAX) {
- char *t2 = shell_escape(s, "$;'\"");
+ char *t2;
+
+ t2 = strreplace(s, "$", "$$");
+ if (!t2)
+ return NULL;
+ free_and_replace(t, t2);
+
+ t2 = shell_escape(t, "\"");
if (!t2)
return NULL;
free_and_replace(t, t2);
@@ -4343,7 +4350,9 @@ const char* unit_escape_setting(const char *s, UnitWriteFlags flags, char **buf)
s = t;
} else if (flags & UNIT_ESCAPE_C) {
- char *t2 = cescape(s);
+ char *t2;
+
+ t2 = cescape(s);
if (!t2)
return NULL;
free_and_replace(t, t2);
diff --git a/src/test/test-core-unit.c b/src/test/test-core-unit.c
index 6593f2fb4b..ea514a5c8c 100644
--- a/src/test/test-core-unit.c
+++ b/src/test/test-core-unit.c
@@ -41,13 +41,13 @@ static void test_unit_escape_setting_one(
TEST(unit_escape_setting) {
test_unit_escape_setting_one("/sbin/sbash", NULL, NULL);
- test_unit_escape_setting_one("$", "\\$", "$");
- test_unit_escape_setting_one("$$", "\\$\\$", "$$");
- test_unit_escape_setting_one("'", "\\'", NULL);
+ test_unit_escape_setting_one("$", "$$", "$");
+ test_unit_escape_setting_one("$$", "$$$$", "$$");
+ test_unit_escape_setting_one("'", "'", "\\'");
test_unit_escape_setting_one("\"", "\\\"", NULL);
test_unit_escape_setting_one("\t", "\\t", NULL);
test_unit_escape_setting_one(" ", NULL, NULL);
- test_unit_escape_setting_one("$;'\"\t\n", "\\$\\;\\'\\\"\\t\\n", "$;\\'\\\"\\t\\n");
+ test_unit_escape_setting_one("$;'\"\t\n", "$$;'\\\"\\t\\n", "$;\\'\\\"\\t\\n");
}
static void test_unit_concat_strv_one(
@@ -89,7 +89,7 @@ TEST(unit_concat_strv) {
NULL);
test_unit_concat_strv_one(STRV_MAKE("a", " ", "$", "$$", ""),
"\"a\" \" \" \"$\" \"$$\" \"\"",
- "\"a\" \" \" \"\\$\" \"\\$\\$\" \"\"",
+ "\"a\" \" \" \"$$\" \"$$$$\" \"\"",
NULL);
test_unit_concat_strv_one(STRV_MAKE("\n", " ", "\t"),
"\"\n\" \" \" \"\t\"",