summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd.service.xml2
-rw-r--r--src/basic/env-util.c2
-rw-r--r--src/test/test-env-replace.c6
3 files changed, 7 insertions, 3 deletions
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index 897ea464d9..8afdbc513b 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -993,7 +993,7 @@
<literal>$FOO</literal> as a separate word on the command line, in
which case it will be replaced by the value of the environment
variable split at whitespace resulting in zero or more arguments.
- For this type of expansion, quotes and respected when splitting
+ For this type of expansion, quotes are respected when splitting
into words, and afterwards removed.</para>
<para>Example:</para>
diff --git a/src/basic/env-util.c b/src/basic/env-util.c
index 4804a67f91..ecb2192c4d 100644
--- a/src/basic/env-util.c
+++ b/src/basic/env-util.c
@@ -541,7 +541,7 @@ char **replace_env_argv(char **argv, char **env) {
STRV_FOREACH(i, argv) {
/* If $FOO appears as single word, replace it by the split up variable */
- if ((*i)[0] == '$' && (*i)[1] != '{') {
+ if ((*i)[0] == '$' && (*i)[1] != '{' && (*i)[1] != '$') {
char *e;
char **w, **m = NULL;
unsigned q;
diff --git a/src/test/test-env-replace.c b/src/test/test-env-replace.c
index 2e28c0c49b..110223f3b8 100644
--- a/src/test/test-env-replace.c
+++ b/src/test/test-env-replace.c
@@ -118,6 +118,8 @@ static void test_replace_env_arg(void) {
"$FOO$FOO",
"${FOO}${BAR}",
"${FOO",
+ "FOO$$${FOO}",
+ "$$FOO${FOO}",
NULL
};
_cleanup_strv_free_ char **r = NULL;
@@ -133,7 +135,9 @@ static void test_replace_env_arg(void) {
assert_se(streq(r[6], "BAR"));
assert_se(streq(r[7], "BAR BARwaldo"));
assert_se(streq(r[8], "${FOO"));
- assert_se(strv_length(r) == 9);
+ assert_se(streq(r[9], "FOO$BAR BAR"));
+ assert_se(streq(r[10], "$FOOBAR BAR"));
+ assert_se(strv_length(r) == 11);
}
static void test_env_clean(void) {