summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Soutar <andrew@andrewsoutar.com>2021-10-05 22:55:27 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-10-12 18:05:25 +0200
commit760491bc6cfc70fd2d94fcf47dd1072b45a1ab45 (patch)
tree339cca27a82b0e54820d66f19f73ee52d183ef10
parent4f3d072cbf7397ce5e2d9f68f34139a0124f6a9a (diff)
downloadsystemd-760491bc6cfc70fd2d94fcf47dd1072b45a1ab45.tar.gz
basic/env-util: correctly parse extended vars after non-extended vars (#20941)
(cherry picked from commit 5ef97a712236f0ddddec52665c0aea7d4e6d3c13) (cherry picked from commit 74583cad5a3bf4051b879b8b1ac53934027ef485)
-rw-r--r--src/basic/env-util.c1
-rw-r--r--src/test/test-env-util.c5
2 files changed, 5 insertions, 1 deletions
diff --git a/src/basic/env-util.c b/src/basic/env-util.c
index c110a750a5..68ba3f5ac3 100644
--- a/src/basic/env-util.c
+++ b/src/basic/env-util.c
@@ -580,6 +580,7 @@ char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
word = e+1;
state = WORD;
+ nest--;
} else if (*e == ':') {
if (!(flags & REPLACE_ENV_ALLOW_EXTENDED))
/* Treat this as unsupported syntax, i.e. do no replacement */
diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c
index ed4580e4af..3d5951c46e 100644
--- a/src/test/test-env-util.c
+++ b/src/test/test-env-util.c
@@ -198,7 +198,7 @@ static void test_replace_env2(bool extended) {
"BAR=bar",
NULL
};
- _cleanup_free_ char *t = NULL, *s = NULL, *q = NULL, *r = NULL, *p = NULL, *x = NULL;
+ _cleanup_free_ char *t = NULL, *s = NULL, *q = NULL, *r = NULL, *p = NULL, *x = NULL, *y = NULL;
unsigned flags = REPLACE_ENV_ALLOW_EXTENDED*extended;
t = replace_env("FOO=${FOO:-${BAR}}", (char**) env, flags);
@@ -218,6 +218,9 @@ static void test_replace_env2(bool extended) {
x = replace_env("XXX=${XXX:+${BAR}post}", (char**) env, flags);
assert_se(streq(x, extended ? "XXX=" : "XXX=${XXX:+barpost}"));
+
+ y = replace_env("FOO=${FOO}between${BAR:-baz}", (char**) env, flags);
+ assert_se(streq(y, extended ? "FOO=foobetweenbar" : "FOO=foobetween${BAR:-baz}"));
}
static void test_replace_env_argv(void) {