]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: cleanup __set_config_cgroup_controller()
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 8 Dec 2020 14:03:15 +0000 (15:03 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 8 Dec 2020 14:40:50 +0000 (15:40 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/conf.h
src/lxc/confile.c

index 907cbdfa527c334fee13c8d705d2017b18f1b77f..92b7ac86bb0ed5b4b41de35df69375d95093194e 100644 (file)
@@ -19,6 +19,7 @@
 #include "config.h"
 #include "list.h"
 #include "lxcseccomp.h"
+#include "memory_utils.h"
 #include "ringbuf.h"
 #include "start.h"
 #include "terminal.h"
@@ -69,6 +70,16 @@ struct lxc_cgroup {
        };
 };
 
+static void free_lxc_cgroup(struct lxc_cgroup *ptr)
+{
+       if (ptr) {
+               free(ptr->subsystem);
+               free(ptr->value);
+               free_disarm(ptr);
+       }
+}
+define_cleanup_function(struct lxc_cgroup *, free_lxc_cgroup);
+
 #if !HAVE_SYS_RESOURCE_H
 #define RLIM_INFINITY ((unsigned long)-1)
 struct rlimit {
index b3e1c2adef5f83edec95dcf962c5956cf099d599..f6fb3bd2765d9aad067e987b9f670076feb69f93 100644 (file)
@@ -1686,10 +1686,10 @@ static int set_config_signal_stop(const char *key, const char *value,
 static int __set_config_cgroup_controller(const char *key, const char *value,
                                          struct lxc_conf *lxc_conf, int version)
 {
+       __do_free struct lxc_list *cglist = NULL;
+       call_cleaner(free_lxc_cgroup) struct lxc_cgroup *cgelem = NULL;
        const char *subkey, *token;
        size_t token_len;
-       struct lxc_list *cglist = NULL;
-       struct lxc_cgroup *cgelem = NULL;
 
        if (lxc_config_value_empty(value))
                return lxc_clear_cgroups(lxc_conf, key, version);
@@ -1701,53 +1701,44 @@ static int __set_config_cgroup_controller(const char *key, const char *value,
                token = "lxc.cgroup.";
                token_len = 11;
        } else {
-               return -EINVAL;
+               return ret_errno(EINVAL);
        }
 
        if (strncmp(key, token, token_len) != 0)
-               return -EINVAL;
+               return ret_errno(EINVAL);
 
        subkey = key + token_len;
        if (*subkey == '\0')
-               return -EINVAL;
+               return ret_errno(EINVAL);
 
        cglist = malloc(sizeof(*cglist));
        if (!cglist)
-               goto out;
+               return ret_errno(ENOMEM);
 
        cgelem = malloc(sizeof(*cgelem));
        if (!cgelem)
-               goto out;
+               return ret_errno(ENOMEM);
        memset(cgelem, 0, sizeof(*cgelem));
 
        cgelem->subsystem = strdup(subkey);
        if (!cgelem->subsystem)
-               goto out;
+               return ret_errno(ENOMEM);
 
        cgelem->value = strdup(value);
        if (!cgelem->value)
-               goto out;
+               return ret_errno(ENOMEM);
 
        cgelem->version = version;
 
-       lxc_list_add_elem(cglist, cgelem);
+       lxc_list_add_elem(cglist, move_ptr(cgelem));
 
        if (version == CGROUP2_SUPER_MAGIC)
                lxc_list_add_tail(&lxc_conf->cgroup2, cglist);
        else
                lxc_list_add_tail(&lxc_conf->cgroup, cglist);
+       move_ptr(cglist);
 
        return 0;
-
-out:
-       free(cglist);
-       if (cgelem) {
-               free(cgelem->subsystem);
-               free(cgelem->value);
-               free(cgelem);
-       }
-
-       return -1;
 }
 
 static int set_config_cgroup_controller(const char *key, const char *value,