[CRIU] [PATCH 2/8] cgroup: don't forget to deallocate cg->sets

Pavel Emelyanov xemul at virtuozzo.com
Thu Jul 21 07:45:12 PDT 2016


On 07/15/2016 10:28 PM, Dmitry Safonov wrote:
> Should we like, free them?

If it's on error path, then ... to make coverity happy :)

Applied

> cgroup.c:890:11: warning: Potential leak of memory pointed to by 'cg.sets'
>                 return -1;
>                         ^
> 
> Signed-off-by: Dmitry Safonov <dsafonov at virtuozzo.com>
> ---
>  criu/cgroup.c | 27 ++++++++++++++++++++++-----
>  1 file changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/criu/cgroup.c b/criu/cgroup.c
> index eb1f6bbd7005..138a27d178e4 100644
> --- a/criu/cgroup.c
> +++ b/criu/cgroup.c
> @@ -808,12 +808,21 @@ static int dump_controllers(CgroupEntry *cg)
>  	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)
>  {
>  	struct cg_set *set;
>  	struct cg_ctl *ctl;
> -	int s, c;
> +	unsigned s, c;
>  	void *m;
>  	CgSetEntry *se;
>  	CgMemberEntry *ce;
> @@ -843,8 +852,10 @@ static int dump_sets(CgroupEntry *cg)
>  		m = xmalloc(se->n_ctls * (sizeof(CgMemberEntry *) + sizeof(CgMemberEntry)));
>  		se->ctls = m;
>  		ce = m + se->n_ctls * sizeof(CgMemberEntry *);
> -		if (!m)
> +		if (!m) {
> +			free_sets(cg, s);
>  			return -1;
> +		}
>  
>  		c = 0;
>  		list_for_each_entry(ctl, &set->ctls, l) {
> @@ -868,6 +879,7 @@ static int dump_sets(CgroupEntry *cg)
>  int dump_cgroups(void)
>  {
>  	CgroupEntry cg = CGROUP_ENTRY__INIT;
> +	int ret = -1;
>  
>  	BUG_ON(!criu_cgset || !root_cgset);
>  
> @@ -886,11 +898,16 @@ int dump_cgroups(void)
>  
>  	if (dump_sets(&cg))
>  		return -1;
> -	if (dump_controllers(&cg))
> -		return -1;
> +	if (dump_controllers(&cg)) {
> +		goto err;
> +	}
>  
>  	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,
> 



More information about the CRIU mailing list