]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc_global_config_value: simplify the theme
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 27 Oct 2014 14:23:10 +0000 (14:23 +0000)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 25 Nov 2014 22:11:29 +0000 (17:11 -0500)
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 <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/utils.c

index ca86c4c57dd1a8282e132d44c4edff15fe795fe4..f3f49d31cd2c54460809da441cfcb9b8fd2cce2e 100644 (file)
@@ -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];
 }