diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-11-08 08:41:13 -0500 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-11-09 19:02:53 -0500 |
commit | a94042fa9b0733ae0c4e27747ee68d1a7865c8c6 (patch) | |
tree | 207a5e207f665c0974b78eac918602e7d34b07c2 | |
parent | 9cb74bcb23dde8488459ca233bf9caee642b8402 (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.c | 24 |
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; |