}
/* 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);
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);
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(
NULL);
test_unit_concat_strv_one(STRV_MAKE("a", " ", "$", "$$", ""),
"\"a\" \" \" \"$\" \"$$\" \"\"",
- "\"a\" \" \" \"\\$\" \"\\$\\$\" \"\"",
+ "\"a\" \" \" \"$$\" \"$$$$\" \"\"",
NULL);
test_unit_concat_strv_one(STRV_MAKE("\n", " ", "\t"),
"\"\n\" \" \" \"\t\"",