Add _cleanup_globfree_
Fixes a memleak in error path in exec_context_load_environment.
This commit is contained in:
parent
b92bea5d2a
commit
c84a948831
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,8 +37,8 @@
|
|||
#include <sys/resource.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <systemd/sd-journal.h>
|
||||
|
||||
#include <systemd/sd-journal.h>
|
||||
#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;
|
||||
|
|
|
@ -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) {
|
||||
k = action(i, *fn);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
}
|
||||
|
||||
STRV_FOREACH(fn, g.gl_pathv)
|
||||
if ((k = action(i, *fn)) < 0)
|
||||
r = k;
|
||||
|
||||
globfree(&g);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue