From: Andrew Soutar Date: Wed, 6 Oct 2021 02:55:27 +0000 (-0400) Subject: basic/env-util: correctly parse extended vars after non-extended vars (#20941) X-Git-Tag: v250-rc1~567 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ef97a712236f0ddddec52665c0aea7d4e6d3c13;p=thirdparty%2Fsystemd.git basic/env-util: correctly parse extended vars after non-extended vars (#20941) --- diff --git a/src/basic/env-util.c b/src/basic/env-util.c index b42ca50b250..bc979915b5b 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -615,6 +615,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) { len = e - word - 2; diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index 0e4b832ba87..fb5dfd7461e 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -217,7 +217,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); @@ -237,6 +237,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) {