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;