Commit f7e8eae4 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Pavel Emelyanov

cgroup: don't forget to deallocate cg->sets

Should we like, free them?
cgroup.c:890:11: warning: Potential leak of memory pointed to by 'cg.sets'
                return -1;
                        ^
Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 8f95747e
...@@ -811,12 +811,21 @@ static int dump_controllers(CgroupEntry *cg) ...@@ -811,12 +811,21 @@ static int dump_controllers(CgroupEntry *cg)
return 0; return 0;
} }
static void free_sets(CgroupEntry *cg, unsigned nr)
{
unsigned i;
for (i = 0; i < nr; i++)
xfree(cg->sets[i]->ctls);
xfree(cg->sets);
}
static int dump_sets(CgroupEntry *cg) static int dump_sets(CgroupEntry *cg)
{ {
struct cg_set *set; struct cg_set *set;
struct cg_ctl *ctl; struct cg_ctl *ctl;
int s, c; unsigned s, c;
void *m; void *m;
CgSetEntry *se; CgSetEntry *se;
CgMemberEntry *ce; CgMemberEntry *ce;
...@@ -846,8 +855,10 @@ static int dump_sets(CgroupEntry *cg) ...@@ -846,8 +855,10 @@ static int dump_sets(CgroupEntry *cg)
m = xmalloc(se->n_ctls * (sizeof(CgMemberEntry *) + sizeof(CgMemberEntry))); m = xmalloc(se->n_ctls * (sizeof(CgMemberEntry *) + sizeof(CgMemberEntry)));
se->ctls = m; se->ctls = m;
ce = m + se->n_ctls * sizeof(CgMemberEntry *); ce = m + se->n_ctls * sizeof(CgMemberEntry *);
if (!m) if (!m) {
free_sets(cg, s);
return -1; return -1;
}
c = 0; c = 0;
list_for_each_entry(ctl, &set->ctls, l) { list_for_each_entry(ctl, &set->ctls, l) {
...@@ -871,6 +882,7 @@ static int dump_sets(CgroupEntry *cg) ...@@ -871,6 +882,7 @@ static int dump_sets(CgroupEntry *cg)
int dump_cgroups(void) int dump_cgroups(void)
{ {
CgroupEntry cg = CGROUP_ENTRY__INIT; CgroupEntry cg = CGROUP_ENTRY__INIT;
int ret = -1;
BUG_ON(!criu_cgset || !root_cgset); BUG_ON(!criu_cgset || !root_cgset);
...@@ -889,11 +901,16 @@ int dump_cgroups(void) ...@@ -889,11 +901,16 @@ int dump_cgroups(void)
if (dump_sets(&cg)) if (dump_sets(&cg))
return -1; return -1;
if (dump_controllers(&cg)) if (dump_controllers(&cg)) {
return -1; goto err;
}
pr_info("Writing CG image\n"); pr_info("Writing CG image\n");
return pb_write_one(img_from_set(glob_imgset, CR_FD_CGROUP), &cg, PB_CGROUP); ret = pb_write_one(img_from_set(glob_imgset, CR_FD_CGROUP), &cg, PB_CGROUP);
err:
free_sets(&cg, cg.n_sets);
xfree(cg.controllers);
return ret;
} }
static int ctrl_dir_and_opt(CgControllerEntry *ctl, char *dir, int ds, static int ctrl_dir_and_opt(CgControllerEntry *ctl, char *dir, int ds,
......
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