From: Lennart Poettering Date: Wed, 17 Oct 2018 18:10:09 +0000 (+0200) Subject: env-util: rework strv_env_merge() X-Git-Tag: v240~511^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2d3ff1decbd382d93b02215b42f2183733dfbca6;p=thirdparty%2Fsystemd.git env-util: rework strv_env_merge() 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 --- diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 314c205e6b3..61ecb010f0a 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -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) {