]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
env-util: rework strv_env_merge()
authorLennart Poettering <lennart@poettering.net>
Wed, 17 Oct 2018 18:10:09 +0000 (20:10 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 17 Oct 2018 18:51:14 +0000 (20:51 +0200)
Let's clean up the failure codepaths, by using _cleanup_.

This relies on the new behaviour of env_append() introduced in the
previous commit that guarantess the list always remains properly NULL
terminated

src/basic/env-util.c

index 314c205e6b35fab0b62946548e5df4b131b9e699..61ecb010f0a847e79ed336498ff9fc7d98c4e80a 100644 (file)
@@ -195,10 +195,10 @@ static int env_append(char **r, char ***k, char **a) {
 }
 
 char **strv_env_merge(size_t n_lists, ...) {
-        size_t n = 0;
-        char **l, **k, **r;
+        _cleanup_strv_free_ char **ret = NULL;
+        size_t n = 0, i;
+        char **l, **k;
         va_list ap;
-        size_t i;
 
         /* Merges an arbitrary number of environment sets */
 
@@ -209,29 +209,24 @@ char **strv_env_merge(size_t n_lists, ...) {
         }
         va_end(ap);
 
-        r = new(char*, n+1);
-        if (!r)
+        ret = new(char*, n+1);
+        if (!ret)
                 return NULL;
 
-        k = r;
+        *ret = NULL;
+        k = ret;
 
         va_start(ap, n_lists);
         for (i = 0; i < n_lists; i++) {
                 l = va_arg(ap, char**);
-                if (env_append(r, &k, l) < 0)
-                        goto fail;
+                if (env_append(ret, &k, l) < 0) {
+                        va_end(ap);
+                        return NULL;
+                }
         }
         va_end(ap);
 
-        *k = NULL;
-
-        return r;
-
-fail:
-        va_end(ap);
-        strv_free(r);
-
-        return NULL;
+        return TAKE_PTR(ret);
 }
 
 static bool env_match(const char *t, const char *pattern) {