On Mon, Oct 27, 2014 at 02:23:10PM +0000, Serge Hallyn wrote:
> Rather than try to free all the not-being-returned items at
> each if clause where we assign one to return value, just NULL
> the one we are returning so we can safely free all the
> values.  This should fix the newly reported coverity memory
> leak
> 
> Signed-off-by: Serge Hallyn <[email protected]>

Acked-by: Stéphane Graber <[email protected]>

> ---
>  src/lxc/utils.c | 30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
> 
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index b572982..34743dd 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -277,7 +277,14 @@ const char *lxc_global_config_value(const char 
> *option_name)
>  #else
>       static const char *values[sizeof(options) / sizeof(options[0])] = { 0 };
>  #endif
> +
> +     /* user_config_path is freed as soon as it is used */
>       char *user_config_path = NULL;
> +
> +     /*
> +      * The following variables are freed at bottom unconditionally.
> +      * So NULL the value if it is to be returned to the caller
> +      */
>       char *user_default_config_path = NULL;
>       char *user_lxc_path = NULL;
>       char *user_cgroup_pattern = NULL;
> @@ -364,8 +371,6 @@ const char *lxc_global_config_value(const char 
> *option_name)
>                       if (!*p)
>                               continue;
>  
> -                     free(user_default_config_path);
> -
>                       if (strcmp(option_name, "lxc.lxcpath") == 0) {
>                               free(user_lxc_path);
>                               user_lxc_path = copy_global_config_value(p);
> @@ -375,7 +380,6 @@ const char *lxc_global_config_value(const char 
> *option_name)
>                       }
>  
>                       values[i] = copy_global_config_value(p);
> -                     free(user_lxc_path);
>                       goto out;
>               }
>       }
> @@ -383,25 +387,19 @@ const char *lxc_global_config_value(const char 
> *option_name)
>       if (strcmp(option_name, "lxc.lxcpath") == 0) {
>               remove_trailing_slashes(user_lxc_path);
>               values[i] = user_lxc_path;
> -             free(user_default_config_path);
> -             free(user_cgroup_pattern);
> +             user_lxc_path = NULL;
>       }
>       else if (strcmp(option_name, "lxc.default_config") == 0) {
>               values[i] = user_default_config_path;
> -             free(user_lxc_path);
> -             free(user_cgroup_pattern);
> +             user_default_config_path = NULL;
>       }
>       else if (strcmp(option_name, "lxc.cgroup.pattern") == 0) {
>               values[i] = user_cgroup_pattern;
> -             free(user_default_config_path);
> -             free(user_lxc_path);
> +             user_cgroup_pattern = NULL;
>       }
> -     else {
> -             free(user_default_config_path);
> -             free(user_lxc_path);
> -             free(user_cgroup_pattern);
> +     else
>               values[i] = (*ptr)[1];
> -     }
> +
>       /* special case: if default value is NULL,
>        * and there is no config, don't view that
>        * as an error... */
> @@ -412,6 +410,10 @@ out:
>       if (fin)
>               fclose(fin);
>  
> +     free(user_cgroup_pattern);
> +     free(user_default_config_path);
> +     free(user_lxc_path);
> +
>       return values[i];
>  }
>  
> -- 
> 2.1.0
> 
> _______________________________________________
> lxc-devel mailing list
> [email protected]
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

Attachment: signature.asc
Description: Digital signature

_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to