chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
systemd: fix memory leak in cgroup code
[elogind.git]
/
src
/
core
/
cgroup.c
diff --git
a/src/core/cgroup.c
b/src/core/cgroup.c
index 6a6c5049b39df1377b571baa2d9e51e0fe80c8b4..1a8fd3728f06acf9179a2170d175507b77e8a91e 100644
(file)
--- 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) {
}
static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
-
char *path = NULL
;
+
_cleanup_free_ char *path
;
int r;
int r;
- bool
i
s_in_hash = false;
+ bool
wa
s_in_hash = false;
assert(u);
path = unit_default_cgroup_path(u);
if (!path)
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)
r = hashmap_put(u->manager->cgroup_unit, path, u);
if (r == 0)
-
i
s_in_hash = true;
-
- if (r < 0) {
- log_error("cgroup %s exists already: %s", path, strerror(-r));
-
free(path
);
+
wa
s_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;
}
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)
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 (!
i
s_in_hash) {
- /*
And r
emember the new data */
+ if (!
wa
s_in_hash) {
+ /*
R
emember the new data */
free(u->cgroup_path);
u->cgroup_path = path;
free(u->cgroup_path);
u->cgroup_path = path;
+ path = NULL;
}
u->cgroup_realized = true;
}
u->cgroup_realized = true;