|
Zbigniew Jędrzejewski-Szmek |
930e1b |
From 7930484abfb17a9c72efdd93ebfc4637ad2be738 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
Date: Fri, 8 Nov 2013 08:41:13 -0500
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
Subject: [PATCH] systemd: fix memory leak in cgroup code
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
If the unit already was in the hashmap, path would be leaked.
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
---
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
src/core/cgroup.c | 24 +++++++++++++-----------
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
1 file changed, 13 insertions(+), 11 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
index 42c0b3f..32e2599 100644
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
--- a/src/core/cgroup.c
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+++ b/src/core/cgroup.c
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
@@ -376,23 +376,23 @@ static CGroupControllerMask unit_get_siblings_mask(Unit *u) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- char *path = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ _cleanup_free_ char *path;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- bool is_in_hash = false;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ bool was_in_hash = false;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
assert(u);
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
path = unit_default_cgroup_path(u);
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
if (!path)
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- return -ENOMEM;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ return log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
r = hashmap_put(u->manager->cgroup_unit, path, u);
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
if (r == 0)
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- is_in_hash = true;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
-
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- log_error("cgroup %s exists already: %s", path, strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- free(path);
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ was_in_hash = true;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ else if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ log_error(r == -EEXIST ?
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ "cgroup %s exists already: %s" : "hashmap_put failed for %s: %s",
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ path, strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
@@ -405,13 +405,15 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
if (u->cgroup_path) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, path);
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- log_error("Failed to migrate cgroup %s: %s", path, strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ log_error("Failed to migrate cgroup from %s to %s: %s",
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ u->cgroup_path, path, strerror(-r));
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- if (!is_in_hash) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
- /* And remember the new data */
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ if (!was_in_hash) {
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ /* Remember the new data */
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
free(u->cgroup_path);
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
u->cgroup_path = path;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
+ path = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
|
|
Zbigniew Jędrzejewski-Szmek |
930e1b |
u->cgroup_realized = true;
|