diff options
-rw-r--r-- | src/core/unit.c | 15 | ||||
-rw-r--r-- | src/test/test-core-unit.c | 10 |
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\"", |