From 2d3ff1decbd382d93b02215b42f2183733dfbca6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 17 Oct 2018 20:10:09 +0200 Subject: [PATCH] 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 --- src/basic/env-util.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 314c205e6b..61ecb010f0 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) { -- 2.25.1