]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: cleanup set_config_sysctl()
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 8 Dec 2020 14:13:41 +0000 (15:13 +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 b06b547434f23b94921956cd564d5421dbdd8e80..1087a75329438cd00d484c3a447ff83d7a2366e2 100644 (file)
@@ -122,6 +122,16 @@ struct lxc_sysctl {
        char *value;
 };
 
+static void free_lxc_sysctl(struct lxc_sysctl *ptr)
+{
+       if (ptr) {
+               free(ptr->key);
+               free(ptr->value);
+               free_disarm(ptr);
+       }
+}
+define_cleanup_function(struct lxc_sysctl *, free_lxc_sysctl);
+
 /*
  * Defines a structure to configure proc filesystem at runtime.
  * @filename : the proc filesystem will be configured without the "lxc.proc" prefix
index 0ffd15e2637fa715530e6494cdd9dcbbfad77655..63435f56b1d2f4fef7f3129a9c1d97c6ce21f521 100644 (file)
@@ -1944,10 +1944,9 @@ static int set_config_prlimit(const char *key, const char *value,
 static int set_config_sysctl(const char *key, const char *value,
                            struct lxc_conf *lxc_conf, void *data)
 {
+       __do_free struct lxc_list *sysctl_list = NULL;
+       call_cleaner(free_lxc_sysctl) struct lxc_sysctl *sysctl_elem = NULL;
        struct lxc_list *iter;
-       char *replace_value = NULL;
-       struct lxc_list *sysctl_list = NULL;
-       struct lxc_sysctl *sysctl_elem = NULL;
 
        if (lxc_config_value_empty(value))
                return clr_config_sysctl(key, lxc_conf, NULL);
@@ -1959,6 +1958,8 @@ static int set_config_sysctl(const char *key, const char *value,
 
        /* find existing list element */
        lxc_list_for_each(iter, &lxc_conf->sysctls) {
+               __do_free char *replace_value = NULL;
+
                sysctl_elem = iter->elem;
 
                if (strcmp(key, sysctl_elem->key) != 0)
@@ -1966,10 +1967,10 @@ static int set_config_sysctl(const char *key, const char *value,
 
                replace_value = strdup(value);
                if (!replace_value)
-                       return -1;
+                       return ret_errno(EINVAL);
 
                free(sysctl_elem->value);
-               sysctl_elem->value = replace_value;
+               sysctl_elem->value = move_ptr(replace_value);
 
                return 0;
        }
@@ -1977,36 +1978,25 @@ static int set_config_sysctl(const char *key, const char *value,
        /* allocate list element */
        sysctl_list = malloc(sizeof(*sysctl_list));
        if (!sysctl_list)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        sysctl_elem = malloc(sizeof(*sysctl_elem));
        if (!sysctl_elem)
-               goto on_error;
+               return ret_errno(ENOMEM);
        memset(sysctl_elem, 0, sizeof(*sysctl_elem));
 
        sysctl_elem->key = strdup(key);
        if (!sysctl_elem->key)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        sysctl_elem->value = strdup(value);
        if (!sysctl_elem->value)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
-       lxc_list_add_elem(sysctl_list, sysctl_elem);
-       lxc_list_add_tail(&lxc_conf->sysctls, sysctl_list);
+       lxc_list_add_elem(sysctl_list, move_ptr(sysctl_elem));
+       lxc_list_add_tail(&lxc_conf->sysctls, move_ptr(sysctl_list));
 
        return 0;
-
-on_error:
-       free(sysctl_list);
-
-       if (sysctl_elem) {
-               free(sysctl_elem->key);
-               free(sysctl_elem->value);
-               free(sysctl_elem);
-       }
-
-       return -1;
 }
 
 static int set_config_proc(const char *key, const char *value,