From fb4cf517ae6ec90dcee7ddf9495d8c9cfe2b902b Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Mon, 27 Oct 2014 14:23:10 +0000 Subject: [PATCH] lxc_global_config_value: simplify the theme MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Acked-by: Stéphane Graber --- 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 ca86c4c57..f3f49d31c 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -249,7 +249,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; @@ -336,8 +343,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); @@ -347,7 +352,6 @@ const char *lxc_global_config_value(const char *option_name) } values[i] = copy_global_config_value(p); - free(user_lxc_path); goto out; } } @@ -355,25 +359,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... */ @@ -384,6 +382,10 @@ out: if (fin) fclose(fin); + free(user_cgroup_pattern); + free(user_default_config_path); + free(user_lxc_path); + return values[i]; } -- 2.47.2