From: Zbigniew Jędrzejewski-Szmek Date: Sun, 24 Mar 2013 23:09:19 +0000 (-0400) Subject: Add _cleanup_globfree_ X-Git-Tag: v201~30 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=c84a94883161073239c35d181e25823ff0454f68 Add _cleanup_globfree_ Fixes a memleak in error path in exec_context_load_environment. --- diff --git a/src/core/execute.c b/src/core/execute.c index c51049767..61369cdc9 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -1698,7 +1698,7 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { int k; bool ignore = false; char **p; - glob_t pglob = {}; + glob_t _cleanup_globfree_ pglob = {}; int count, n; fn = *i; @@ -1709,7 +1709,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { } if (!path_is_absolute(fn)) { - if (ignore) continue; @@ -1720,7 +1719,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { /* Filename supports globbing, take all matching files */ errno = 0; if (glob(fn, 0, NULL, &pglob) != 0) { - globfree(&pglob); if (ignore) continue; @@ -1729,7 +1727,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { } count = pglob.gl_pathc; if (count == 0) { - globfree(&pglob); if (ignore) continue; @@ -1743,7 +1740,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { continue; strv_free(r); - globfree(&pglob); return k; } @@ -1755,16 +1751,12 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { m = strv_env_merge(2, r, p); strv_free(r); strv_free(p); - - if (!m) { - globfree(&pglob); + if (!m) return -ENOMEM; - } r = m; } } - globfree(&pglob); } *l = r; diff --git a/src/shared/util.c b/src/shared/util.c index 2f66597de..52867a177 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -4322,7 +4322,7 @@ int in_group(const char *name) { } int glob_exists(const char *path) { - glob_t g; + glob_t _cleanup_globfree_ g = {}; int r, k; assert(path); @@ -4339,8 +4339,6 @@ int glob_exists(const char *path) { else r = errno ? -errno : -EIO; - globfree(&g); - return r; } diff --git a/src/shared/util.h b/src/shared/util.h index 4c4aed583..bea43fc4b 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -37,8 +37,8 @@ #include #include #include -#include +#include #include "macro.h" #include "time-util.h" @@ -539,6 +539,8 @@ static inline void journal_closep(sd_journal **j) { sd_journal_close(*j); } +#define _cleanup_globfree_ __attribute__((cleanup(globfree))) + _malloc_ static inline void *malloc_multiply(size_t a, size_t b) { if (_unlikely_(b == 0 || a > ((size_t) -1) / b)) return NULL; diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 51827f01a..5d32bd197 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -601,12 +601,12 @@ static int recursive_relabel(Item *i, const char *path) { static int glob_item(Item *i, int (*action)(Item *, const char *)) { int r = 0, k; - glob_t g = {}; + glob_t _cleanup_globfree_ g = {}; char **fn; errno = 0; - if ((k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g)) != 0) { - + k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g); + if (k != 0) if (k != GLOB_NOMATCH) { if (errno > 0) errno = EIO; @@ -614,13 +614,13 @@ static int glob_item(Item *i, int (*action)(Item *, const char *)) { log_error("glob(%s) failed: %m", i->path); return -errno; } - } - STRV_FOREACH(fn, g.gl_pathv) - if ((k = action(i, *fn)) < 0) + STRV_FOREACH(fn, g.gl_pathv) { + k = action(i, *fn); + if (k < 0) r = k; + } - globfree(&g); return r; }