summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-03-24 19:09:19 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-04-05 19:58:53 -0400
commitc84a94883161073239c35d181e25823ff0454f68 (patch)
tree64c6fbf807493f3d878fa53113ba857116de7393 /src
parentb92bea5d2a9481de69bb627a7b442a9f58fca43d (diff)
Add _cleanup_globfree_
Fixes a memleak in error path in exec_context_load_environment.
Diffstat (limited to 'src')
-rw-r--r--src/core/execute.c12
-rw-r--r--src/shared/util.c4
-rw-r--r--src/shared/util.h4
-rw-r--r--src/tmpfiles/tmpfiles.c14
4 files changed, 13 insertions, 21 deletions
diff --git a/src/core/execute.c b/src/core/execute.c
index c51049767d..61369cdc93 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 2f66597de3..52867a1779 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 4c4aed583e..bea43fc4bc 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -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;
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index 51827f01af..5d32bd1975 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;
}