[lxc-devel] [PATCH 2/2] fix some larger memory leaks in cgroup code

Serge Hallyn serge.hallyn at ubuntu.com
Tue Sep 24 23:46:44 UTC 2013


From: Dwight Engen <dwight.engen at oracle.com>

Don't worry about saved_errno since none of the *_free routines will set it

Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
 src/lxc/cgroup.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
index 72abc2f..730d3b7 100644
--- a/src/lxc/cgroup.c
+++ b/src/lxc/cgroup.c
@@ -296,7 +296,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
 		return false;
 
 	while (getline(&line, &sz, proc_self_mountinfo) != -1) {
-		char *token, *saveptr = NULL;
+		char *token, *line_tok, *saveptr = NULL;
 		size_t i, j, k;
 		struct cgroup_mount_point *mount_point;
 		struct cgroup_hierarchy *h;
@@ -305,7 +305,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
 		if (line[0] && line[strlen(line) - 1] == '\n')
 			line[strlen(line) - 1] = '\0';
 
-		for (i = 0; (token = strtok_r(line, " ", &saveptr)); line = NULL) {
+		for (i = 0, line_tok = line; (token = strtok_r(line_tok, " ", &saveptr)); line_tok = NULL) {
 			r = lxc_grow_array((void ***)&tokens, &token_capacity, i + 1, 64);
 			if (r < 0)
 				goto out;
@@ -477,6 +477,7 @@ struct cgroup_meta_data *lxc_cgroup_put_meta(struct cgroup_meta_data *meta_data)
 			lxc_cgroup_hierarchy_free(meta_data->hierarchies[i]);
 	}
 	free(meta_data->hierarchies);
+	free(meta_data);
 	return NULL;
 }
 
@@ -1103,29 +1104,30 @@ char *lxc_cgroup_get_hierarchy_abs_path(const char *subsystem, const char *name,
 	struct cgroup_process_info *base_info, *info;
 	struct cgroup_mount_point *mp;
 	char *result = NULL;
-	int saved_errno;
 
 	meta = lxc_cgroup_load_meta();
 	if (!meta)
 		return NULL;
 	base_info = lxc_cgroup_get_container_info(name, lxcpath, meta);
 	if (!base_info)
-		return NULL;
+		goto out1;
 	info = find_info_for_subsystem(base_info, subsystem);
 	if (!info)
-		return NULL;
+		goto out2;
 	if (info->designated_mount_point) {
 		mp = info->designated_mount_point;
 	} else {
 		mp = lxc_cgroup_find_mount_point(info->hierarchy, info->cgroup_path, true);
 		if (!mp)
-			return NULL;
+			goto out3;
 	}
 	result = cgroup_to_absolute_path(mp, info->cgroup_path, NULL);
-	saved_errno = errno;
+out3:
+	lxc_cgroup_process_info_free(info);
+out2:
 	lxc_cgroup_process_info_free(base_info);
+out1:
 	lxc_cgroup_put_meta(meta);
-	errno = saved_errno;
 	return result;
 }
 
-- 
1.8.3.2





More information about the lxc-devel mailing list