]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/env-util: correctly parse extended vars after non-extended vars (#20941)
authorAndrew Soutar <andrew@andrewsoutar.com>
Wed, 6 Oct 2021 02:55:27 +0000 (22:55 -0400)
committerGitHub <noreply@github.com>
Wed, 6 Oct 2021 02:55:27 +0000 (11:55 +0900)
src/basic/env-util.c
src/test/test-env-util.c

index b42ca50b2505ae81c01b79bdbc7040925c031532..bc979915b5bf30da042adbf478180f985c98aad4 100644 (file)
@@ -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;
index 0e4b832ba8727523f2bd1165e5a1ff1b75efe66c..fb5dfd7461ea5f31e1190b0ea229d8a3f1d73dfd 100644 (file)
@@ -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) {