Commit 178938fe by Dwight Engen Committed by Serge Hallyn

fix some larger memory leaks in cgroup code

Don't worry about saved_errno since none of the *_free routines will set it Signed-off-by: 's avatarDwight Engen <dwight.engen@oracle.com> Signed-off-by: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com>
parent b653309a
...@@ -296,7 +296,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char ** ...@@ -296,7 +296,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
return false; return false;
while (getline(&line, &sz, proc_self_mountinfo) != -1) { while (getline(&line, &sz, proc_self_mountinfo) != -1) {
char *token, *saveptr = NULL; char *token, *line_tok, *saveptr = NULL;
size_t i, j, k; size_t i, j, k;
struct cgroup_mount_point *mount_point; struct cgroup_mount_point *mount_point;
struct cgroup_hierarchy *h; struct cgroup_hierarchy *h;
...@@ -305,7 +305,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char ** ...@@ -305,7 +305,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
if (line[0] && line[strlen(line) - 1] == '\n') if (line[0] && line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0'; 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); r = lxc_grow_array((void ***)&tokens, &token_capacity, i + 1, 64);
if (r < 0) if (r < 0)
goto out; goto out;
...@@ -477,6 +477,7 @@ struct cgroup_meta_data *lxc_cgroup_put_meta(struct cgroup_meta_data *meta_data) ...@@ -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]); lxc_cgroup_hierarchy_free(meta_data->hierarchies[i]);
} }
free(meta_data->hierarchies); free(meta_data->hierarchies);
free(meta_data);
return NULL; return NULL;
} }
...@@ -1103,29 +1104,30 @@ char *lxc_cgroup_get_hierarchy_abs_path(const char *subsystem, const char *name, ...@@ -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_process_info *base_info, *info;
struct cgroup_mount_point *mp; struct cgroup_mount_point *mp;
char *result = NULL; char *result = NULL;
int saved_errno;
meta = lxc_cgroup_load_meta(); meta = lxc_cgroup_load_meta();
if (!meta) if (!meta)
return NULL; return NULL;
base_info = lxc_cgroup_get_container_info(name, lxcpath, meta); base_info = lxc_cgroup_get_container_info(name, lxcpath, meta);
if (!base_info) if (!base_info)
return NULL; goto out1;
info = find_info_for_subsystem(base_info, subsystem); info = find_info_for_subsystem(base_info, subsystem);
if (!info) if (!info)
return NULL; goto out2;
if (info->designated_mount_point) { if (info->designated_mount_point) {
mp = info->designated_mount_point; mp = info->designated_mount_point;
} else { } else {
mp = lxc_cgroup_find_mount_point(info->hierarchy, info->cgroup_path, true); mp = lxc_cgroup_find_mount_point(info->hierarchy, info->cgroup_path, true);
if (!mp) if (!mp)
return NULL; goto out3;
} }
result = cgroup_to_absolute_path(mp, info->cgroup_path, NULL); 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); lxc_cgroup_process_info_free(base_info);
out1:
lxc_cgroup_put_meta(meta); lxc_cgroup_put_meta(meta);
errno = saved_errno;
return result; return result;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment