summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-11-08 08:41:13 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-11-09 19:02:53 -0500
commita94042fa9b0733ae0c4e27747ee68d1a7865c8c6 (patch)
tree207a5e207f665c0974b78eac918602e7d34b07c2
parent9cb74bcb23dde8488459ca233bf9caee642b8402 (diff)
systemd: fix memory leak in cgroup code
If the unit already was in the hashmap, path would be leaked.
-rw-r--r--src/core/cgroup.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 6a6c5049b3..1a8fd3728f 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -376,23 +376,23 @@ static CGroupControllerMask unit_get_siblings_mask(Unit *u) {
}
static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
- char *path = NULL;
+ _cleanup_free_ char *path;
int r;
- bool is_in_hash = false;
+ bool was_in_hash = false;
assert(u);
path = unit_default_cgroup_path(u);
if (!path)
- return -ENOMEM;
+ return log_oom();
r = hashmap_put(u->manager->cgroup_unit, path, u);
if (r == 0)
- is_in_hash = true;
-
- if (r < 0) {
- log_error("cgroup %s exists already: %s", path, strerror(-r));
- free(path);
+ was_in_hash = true;
+ else if (r < 0) {
+ log_error(r == -EEXIST ?
+ "cgroup %s exists already: %s" : "hashmap_put failed for %s: %s",
+ path, strerror(-r));
return r;
}
@@ -405,13 +405,15 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
if (u->cgroup_path) {
r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, path);
if (r < 0)
- log_error("Failed to migrate cgroup %s: %s", path, strerror(-r));
+ log_error("Failed to migrate cgroup from %s to %s: %s",
+ u->cgroup_path, path, strerror(-r));
}
- if (!is_in_hash) {
- /* And remember the new data */
+ if (!was_in_hash) {
+ /* Remember the new data */
free(u->cgroup_path);
u->cgroup_path = path;
+ path = NULL;
}
u->cgroup_realized = true;