The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3595

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 62af653cc125c90997b48179fbcff7e0fe6317b6 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:34:06 +0100
Subject: [PATCH 01/25] confile: cleanup set_config_personality()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index e7ab359291..e7f9df3c49 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1242,8 +1242,9 @@ static int set_config_hooks_version(const char *key, 
const char *value,
 static int set_config_personality(const char *key, const char *value,
                                  struct lxc_conf *lxc_conf, void *data)
 {
-       signed long personality = lxc_config_parse_arch(value);
+       signed long personality;
 
+       personality = lxc_config_parse_arch(value);
        if (personality >= 0)
                lxc_conf->personality = personality;
        else

From 49aabd9d60e3879254ac6601a2fadb268259cc7e Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:36:17 +0100
Subject: [PATCH 02/25] confile: cleanup set_config_pty_max()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index e7f9df3c49..412d1045bc 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1266,7 +1266,7 @@ static int set_config_pty_max(const char *key, const char 
*value,
 
        ret = lxc_safe_uint(value, &max);
        if (ret < 0)
-               return -1;
+               return ret_errno(EINVAL);
 
        lxc_conf->pty_max = max;
 

From 572f6a14705f2e1a187cc50f40e825a774cf5de1 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:38:16 +0100
Subject: [PATCH 03/25] confile: cleanup set_config_start()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 412d1045bc..38416e840c 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1281,6 +1281,7 @@ static int set_config_pty_max(const char *key, const char 
*value,
 static int set_config_start(const char *key, const char *value,
                            struct lxc_conf *lxc_conf, void *data)
 {
+       int ret;
        bool is_empty;
 
        is_empty = lxc_config_value_empty(value);
@@ -1291,11 +1292,12 @@ static int set_config_start(const char *key, const char 
*value,
                        return 0;
                }
 
-               if (lxc_safe_uint(value, &lxc_conf->start_auto) < 0)
-                       return -1;
+               ret = lxc_safe_uint(value, &lxc_conf->start_auto);
+               if (ret)
+                       return ret;
 
                if (lxc_conf->start_auto > 1)
-                       return -1;
+                       return ret_errno(EINVAL);
 
                return 0;
        } else if (*(key + 10) == 'd') { /* lxc.start.delay */
@@ -1314,7 +1316,7 @@ static int set_config_start(const char *key, const char 
*value,
                return lxc_safe_int(value, &lxc_conf->start_order);
        }
 
-       return -1;
+       return ret_errno(EINVAL);
 }
 
 static int set_config_monitor(const char *key, const char *value,

From e16659731606d7f2ef9debe62dd872cbc403eb75 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:38:57 +0100
Subject: [PATCH 04/25] confile: cleanup set_config_monitor()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 38416e840c..6bf8143606 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1330,7 +1330,7 @@ static int set_config_monitor(const char *key, const char 
*value,
        if (strcmp(key + 12, "unshare") == 0)
                return lxc_safe_uint(value, &lxc_conf->monitor_unshare);
 
-       return -1;
+       return ret_errno(EINVAL);
 }
 
 static int set_config_monitor_signal_pdeath(const char *key, const char *value,

From cb5f3df2588ecf3c34716c6cac49dbfcaf6a83ff Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:39:49 +0100
Subject: [PATCH 05/25] confile: cleanup set_config_monitor_signal_pdeath()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 6bf8143606..4d1acc1fb1 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1346,13 +1346,13 @@ static int set_config_monitor_signal_pdeath(const char 
*key, const char *value,
 
                sig_n = sig_parse(value);
                if (sig_n < 0)
-                       return -1;
+                       return ret_errno(EINVAL);
 
                lxc_conf->monitor_signal_pdeath = sig_n;
                return 0;
        }
 
-       return -EINVAL;
+       return ret_errno(EINVAL);
 }
 
 static int set_config_group(const char *key, const char *value,

From 154369953583fa1b321f588f142bdee724d4106e Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:43:50 +0100
Subject: [PATCH 06/25] confile: cleanup set_config_group()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 4d1acc1fb1..6900111dd0 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1358,40 +1358,34 @@ static int set_config_monitor_signal_pdeath(const char 
*key, const char *value,
 static int set_config_group(const char *key, const char *value,
                            struct lxc_conf *lxc_conf, void *data)
 {
-       char *groups, *token;
-       struct lxc_list *grouplist;
-       int ret = 0;
+       __do_free char *groups = NULL;
+       char *token;
 
        if (lxc_config_value_empty(value))
                return lxc_clear_groups(lxc_conf);
 
        groups = strdup(value);
        if (!groups)
-               return -1;
+               return ret_errno(ENOMEM);
 
        /* In case several groups are specified in a single line split these
         * groups in a single element for the list.
         */
        lxc_iterate_parts(token, groups, " \t") {
+               __do_free struct lxc_list *grouplist = NULL;
+
                grouplist = malloc(sizeof(*grouplist));
-               if (!grouplist) {
-                       ret = -1;
-                       break;
-               }
+               if (!grouplist)
+                       return ret_errno(ENOMEM);
 
                grouplist->elem = strdup(token);
-               if (!grouplist->elem) {
-                       free(grouplist);
-                       ret = -1;
-                       break;
-               }
+               if (!grouplist->elem)
+                       return ret_errno(ENOMEM);
 
-               lxc_list_add_tail(&lxc_conf->groups, grouplist);
+               lxc_list_add_tail(&lxc_conf->groups, move_ptr(grouplist));
        }
 
-       free(groups);
-
-       return ret;
+       return 0;
 }
 
 static int set_config_environment(const char *key, const char *value,

From a6bf1128ebe08bd56a7e1f4481294485e22213fd Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:46:30 +0100
Subject: [PATCH 07/25] confile: cleanup set_config_environment()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 6900111dd0..56a0931fc9 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1391,14 +1391,14 @@ static int set_config_group(const char *key, const char 
*value,
 static int set_config_environment(const char *key, const char *value,
                                  struct lxc_conf *lxc_conf, void *data)
 {
-       struct lxc_list *list_item = NULL;
+       __do_free struct lxc_list *list_item = NULL;
 
        if (lxc_config_value_empty(value))
                return lxc_clear_environment(lxc_conf);
 
        list_item = malloc(sizeof(*list_item));
        if (!list_item)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        if (!strchr(value, '=')) {
                const char *env_val;
@@ -1407,7 +1407,7 @@ static int set_config_environment(const char *key, const 
char *value,
 
                env_val = getenv(env_key);
                if (!env_val)
-                       goto on_error;
+                       return ret_errno(ENOENT);
 
                env_var[0] = env_key;
                env_var[1] = env_val;
@@ -1417,16 +1417,11 @@ static int set_config_environment(const char *key, 
const char *value,
        }
 
        if (!list_item->elem)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
-       lxc_list_add_tail(&lxc_conf->environment, list_item);
+       lxc_list_add_tail(&lxc_conf->environment, move_ptr(list_item));
 
        return 0;
-
-on_error:
-       free(list_item);
-
-       return -1;
 }
 
 static int set_config_tty_max(const char *key, const char *value,

From 755d65326956b5950e9e32057fdef3f288e52b70 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:46:54 +0100
Subject: [PATCH 08/25] confile: cleanup set_config_tty_max()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 56a0931fc9..713c66386a 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1437,7 +1437,7 @@ static int set_config_tty_max(const char *key, const char 
*value,
 
        ret = lxc_safe_uint(value, &nbtty);
        if (ret < 0)
-               return -1;
+               return ret;
 
        lxc_conf->ttys.max = nbtty;
 

From 042f87117f4336273ebce6d6f233d858a66e1a1d Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:47:46 +0100
Subject: [PATCH 09/25] confile: cleanup set_config_apparmor_allow_incomplete()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 713c66386a..7dfd984230 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1462,16 +1462,19 @@ static int set_config_apparmor_allow_incomplete(const 
char *key,
                                                struct lxc_conf *lxc_conf,
                                                void *data)
 {
+       int ret;
+
        if (lxc_config_value_empty(value)) {
                lxc_conf->lsm_aa_allow_incomplete = 0;
                return 0;
        }
 
-       if (lxc_safe_uint(value, &lxc_conf->lsm_aa_allow_incomplete) < 0)
-               return -1;
+       ret = lxc_safe_uint(value, &lxc_conf->lsm_aa_allow_incomplete);
+       if (ret)
+               return ret;
 
        if (lxc_conf->lsm_aa_allow_incomplete > 1)
-               return -1;
+               return ret_errno(EINVAL);
 
        return 0;
 }

From 55a7689135b3e8f47891d85e983422a40146d0ab Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:48:33 +0100
Subject: [PATCH 10/25] confile: cleanup set_config_apparmor_allow_nesting()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 7dfd984230..373d0d6f03 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1484,14 +1484,17 @@ static int set_config_apparmor_allow_nesting(const char 
*key,
                                             struct lxc_conf *lxc_conf,
                                             void *data)
 {
+       int ret;
+
        if (lxc_config_value_empty(value))
                return clr_config_apparmor_allow_nesting(key, lxc_conf, NULL);
 
-       if (lxc_safe_uint(value, &lxc_conf->lsm_aa_allow_nesting) < 0)
-               return -1;
+       ret = lxc_safe_uint(value, &lxc_conf->lsm_aa_allow_nesting);
+       if (ret)
+               return ret;
 
        if (lxc_conf->lsm_aa_allow_nesting > 1)
-               return -1;
+               return ret_errno(EINVAL);
 
        return 0;
 }

From 7f44fda1da647d40771facaa771916151eb7bd84 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:50:25 +0100
Subject: [PATCH 11/25] confile: cleanup set_config_apparmor_raw()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 373d0d6f03..89029c22ce 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1504,26 +1504,22 @@ static int set_config_apparmor_raw(const char *key,
                                   struct lxc_conf *lxc_conf,
                                   void *data)
 {
-       char *elem;
-       struct lxc_list *list;
+       __do_free char *elem = NULL;
+       __do_free struct lxc_list *list = NULL;
 
        if (lxc_config_value_empty(value))
                return lxc_clear_apparmor_raw(lxc_conf);
 
        list = malloc(sizeof(*list));
-       if (!list) {
-               errno = ENOMEM;
-               return -1;
-       }
+       if (!list)
+               return ret_errno(ENOMEM);
 
        elem = strdup(value);
-       if (!elem) {
-               free(list);
-               return -1;
-       }
-       list->elem = elem;
+       if (!elem)
+               return ret_errno(ENOMEM);
 
-       lxc_list_add_tail(&lxc_conf->lsm_aa_raw, list);
+       list->elem = move_ptr(elem);
+       lxc_list_add_tail(&lxc_conf->lsm_aa_raw, move_ptr(list));
 
        return 0;
 }

From 34f3b30a78a74e543ba9029570fd07d0ba780200 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:51:22 +0100
Subject: [PATCH 12/25] confile: cleanup set_config_log_file()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 89029c22ce..4854acee41 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1548,12 +1548,12 @@ static int set_config_log_file(const char *key, const 
char *value,
        int ret;
 
        if (lxc_config_value_empty(value)) {
-               free(c->logfile);
-               c->logfile = NULL;
+               free_disarm(c->logfile);
                return 0;
        }
 
-       /* Store these values in the lxc_conf, and then try to set for actual
+       /*
+        * Store these values in the lxc_conf, and then try to set for actual
         * current logging.
         */
        ret = set_config_path_item(&c->logfile, value);

From 806244c69d2faf83172efe70c7f9a5326e6a2582 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:52:05 +0100
Subject: [PATCH 13/25] confile: cleanup set_config_log_level()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 4854acee41..57ea4dc084 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1574,13 +1574,17 @@ static int set_config_log_level(const char *key, const 
char *value,
        }
 
        if (value[0] >= '0' && value[0] <= '9') {
-               if (lxc_safe_int(value, &newlevel) < 0)
-                       return -1;
+               int ret;
+
+               ret = lxc_safe_int(value, &newlevel);
+               if (ret)
+                       return ret_errno(EINVAL);
        } else {
                newlevel = lxc_log_priority_to_int(value);
        }
 
-       /* Store these values in the lxc_conf, and then try to set for actual
+       /*
+        * Store these values in the lxc_conf, and then try to set for actual
         * current logging.
         */
        lxc_conf->loglevel = newlevel;

From 0c48b874fda6f23bee0a438ca67b4dc0a1e98dcb Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:52:42 +0100
Subject: [PATCH 14/25] confile: cleanup set_config_log_level()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 57ea4dc084..7f42b9b1f5 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1595,16 +1595,19 @@ static int set_config_log_level(const char *key, const 
char *value,
 static int set_config_autodev(const char *key, const char *value,
                              struct lxc_conf *lxc_conf, void *data)
 {
+       int ret;
+
        if (lxc_config_value_empty(value)) {
                lxc_conf->autodev = 0;
                return 0;
        }
 
-       if (lxc_safe_uint(value, &lxc_conf->autodev) < 0)
-               return -1;
+       ret = lxc_safe_uint(value, &lxc_conf->autodev);
+       if (ret)
+               return ret_errno(EINVAL);
 
        if (lxc_conf->autodev > 1)
-               return -1;
+               return ret_errno(EINVAL);
 
        return 0;
 }

From d12fabf8d61072d248a430edac8f6c06f6f6dcfa Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:53:11 +0100
Subject: [PATCH 15/25] confile: cleanup set_config_signal_halt()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 7f42b9b1f5..5597c3928b 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1638,7 +1638,7 @@ static int set_config_signal_halt(const char *key, const 
char *value,
 
        sig_n = sig_parse(value);
        if (sig_n < 0)
-               return -1;
+               return ret_errno(EINVAL);
 
        lxc_conf->haltsignal = sig_n;
 

From 7d6b1a204af66bd3b4130b11aa5777484a1d7ca2 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:53:32 +0100
Subject: [PATCH 16/25] confile: cleanup set_config_signal_reboot()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 5597c3928b..00e37a89e0 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1657,7 +1657,7 @@ static int set_config_signal_reboot(const char *key, 
const char *value,
 
        sig_n = sig_parse(value);
        if (sig_n < 0)
-               return -1;
+               return ret_errno(EINVAL);
 
        lxc_conf->rebootsignal = sig_n;
 

From c4d9b159421e251ee5afa065eb78a2a8cef6b063 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 14:53:52 +0100
Subject: [PATCH 17/25] confile: cleanup set_config_signal_stop()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 00e37a89e0..b3e1c2adef 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1676,7 +1676,7 @@ static int set_config_signal_stop(const char *key, const 
char *value,
 
        sig_n = sig_parse(value);
        if (sig_n < 0)
-               return -1;
+               return ret_errno(EINVAL);
 
        lxc_conf->stopsignal = sig_n;
 

From ee91fa0616a47490b0eb0a71a46aebbdf9c7abe3 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:03:15 +0100
Subject: [PATCH 18/25] confile: cleanup __set_config_cgroup_controller()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/conf.h    | 11 +++++++++++
 src/lxc/confile.c | 31 +++++++++++--------------------
 2 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 907cbdfa52..92b7ac86bb 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -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 {
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index b3e1c2adef..f6fb3bd276 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -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,

From c521771abbb95b08b61e7db6cdada779ea3d1e04 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:04:31 +0100
Subject: [PATCH 19/25] confile: cleanup set_config_cgroup_relative()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index f6fb3bd276..544c491346 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1822,8 +1822,8 @@ static int set_config_cgroup_relative(const char *key, 
const char *value,
                return clr_config_cgroup_relative(key, lxc_conf, NULL);
 
        ret = lxc_safe_uint(value, &converted);
-       if (ret < 0)
-               return -ret;
+       if (ret)
+               return ret;
 
        if (converted == 1) {
                lxc_conf->cgroup_meta.relative = true;
@@ -1835,7 +1835,7 @@ static int set_config_cgroup_relative(const char *key, 
const char *value,
                return 0;
        }
 
-       return -EINVAL;
+       return ret_errno(EINVAL);
 }
 
 static bool parse_limit_value(const char **value, rlim_t *res)

From 8fa831e0dce6a1ed323e8fc3de2cce74d5fb4bcb Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:09:37 +0100
Subject: [PATCH 20/25] confile: cleanup set_config_prlimit()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/conf.h    |  9 +++++++++
 src/lxc/confile.c | 34 ++++++++++++----------------------
 2 files changed, 21 insertions(+), 22 deletions(-)

diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 92b7ac86bb..b06b547434 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -98,6 +98,15 @@ struct lxc_limit {
        struct rlimit limit;
 };
 
+static void free_lxc_limit(struct lxc_limit *ptr)
+{
+       if (ptr) {
+               free(ptr->resource);
+               free_disarm(ptr);
+       }
+}
+define_cleanup_function(struct lxc_limit *, free_lxc_limit);
+
 enum idtype {
        ID_TYPE_UID,
        ID_TYPE_GID
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 544c491346..0ffd15e263 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1861,23 +1861,23 @@ static bool parse_limit_value(const char **value, 
rlim_t *res)
 static int set_config_prlimit(const char *key, const char *value,
                            struct lxc_conf *lxc_conf, void *data)
 {
+       __do_free struct lxc_list *limlist = NULL;
+       call_cleaner(free_lxc_limit) struct lxc_limit *limelem = NULL;
        struct lxc_list *iter;
        struct rlimit limit;
        rlim_t limit_value;
-       struct lxc_list *limlist = NULL;
-       struct lxc_limit *limelem = NULL;
 
        if (lxc_config_value_empty(value))
                return lxc_clear_limits(lxc_conf, key);
 
        if (strncmp(key, "lxc.prlimit.", STRLITERALLEN("lxc.prlimit.")) != 0)
-               return -1;
+               return ret_errno(EINVAL);
 
        key += STRLITERALLEN("lxc.prlimit.");
 
        /* soft limit comes first in the value */
        if (!parse_limit_value(&value, &limit_value))
-               return -1;
+               return ret_errno(EINVAL);
 
        limit.rlim_cur = limit_value;
 
@@ -1888,7 +1888,7 @@ static int set_config_prlimit(const char *key, const char 
*value,
        if (*value == ':')
                ++value;
        else if (*value) /* any other character is an error here */
-               return -1;
+               return ret_errno(EINVAL);
 
        while (isspace(*value))
                ++value;
@@ -1896,7 +1896,7 @@ static int set_config_prlimit(const char *key, const char 
*value,
        /* optional hard limit */
        if (*value) {
                if (!parse_limit_value(&value, &limit_value))
-                       return -1;
+                       return ret_errno(EINVAL);
 
                limit.rlim_max = limit_value;
 
@@ -1905,7 +1905,7 @@ static int set_config_prlimit(const char *key, const char 
*value,
                        ++value;
 
                if (*value)
-                       return -1;
+                       return ret_errno(EINVAL);
        } else {
                /* a single value sets both hard and soft limit */
                limit.rlim_max = limit.rlim_cur;
@@ -1923,32 +1923,22 @@ static int set_config_prlimit(const char *key, const 
char *value,
        /* allocate list element */
        limlist = malloc(sizeof(*limlist));
        if (!limlist)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        limelem = malloc(sizeof(*limelem));
        if (!limelem)
-               goto on_error;
+               return ret_errno(ENOMEM);
        memset(limelem, 0, sizeof(*limelem));
 
        limelem->resource = strdup(key);
        if (!limelem->resource)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        limelem->limit = limit;
-       lxc_list_add_elem(limlist, limelem);;
-       lxc_list_add_tail(&lxc_conf->limits, limlist);
+       lxc_list_add_elem(limlist, move_ptr(limelem));;
+       lxc_list_add_tail(&lxc_conf->limits, move_ptr(limlist));
 
        return 0;
-
-on_error:
-       free(limlist);
-
-       if (limelem) {
-               free(limelem->resource);
-               free(limelem);
-       }
-
-       return -1;
 }
 
 static int set_config_sysctl(const char *key, const char *value,

From f10c80d258c89e8724d6376e1dc3998d8490eaee Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:13:41 +0100
Subject: [PATCH 21/25] confile: cleanup set_config_sysctl()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/conf.h    | 10 ++++++++++
 src/lxc/confile.c | 34 ++++++++++++----------------------
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index b06b547434..1087a75329 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -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
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 0ffd15e263..63435f56b1 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -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,

From 83332c2473747d9b767be6dd31cac698da733b8d Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:19:33 +0100
Subject: [PATCH 22/25] confile: cleanup set_config_proc()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/conf.h    | 10 ++++++++++
 src/lxc/confile.c | 34 ++++++++++++----------------------
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 1087a75329..116479df94 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -142,6 +142,16 @@ struct lxc_proc {
        char *value;
 };
 
+static void free_lxc_proc(struct lxc_proc *ptr)
+{
+       if (ptr) {
+               free(ptr->filename);
+               free(ptr->value);
+               free_disarm(ptr);
+       }
+}
+define_cleanup_function(struct lxc_proc *, free_lxc_proc);
+
 /*
  * id_map is an id map entry.  Form in confile is:
  * lxc.idmap = u 0    9800 100
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 63435f56b1..a737bd778f 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -2002,9 +2002,9 @@ static int set_config_sysctl(const char *key, const char 
*value,
 static int set_config_proc(const char *key, const char *value,
                            struct lxc_conf *lxc_conf, void *data)
 {
+       __do_free struct lxc_list *proclist = NULL;
+       call_cleaner(free_lxc_proc) struct lxc_proc *procelem = NULL;
        const char *subkey;
-       struct lxc_list *proclist = NULL;
-       struct lxc_proc *procelem = NULL;
 
        if (lxc_config_value_empty(value))
                return clr_config_proc(key, lxc_conf, NULL);
@@ -2014,39 +2014,29 @@ static int set_config_proc(const char *key, const char 
*value,
 
        subkey = key + STRLITERALLEN("lxc.proc.");
        if (*subkey == '\0')
-               return -EINVAL;
+               return ret_errno(EINVAL);
 
        proclist = malloc(sizeof(*proclist));
        if (!proclist)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        procelem = malloc(sizeof(*procelem));
        if (!procelem)
-               goto on_error;
+               return ret_errno(ENOMEM);
        memset(procelem, 0, sizeof(*procelem));
 
        procelem->filename = strdup(subkey);
-       procelem->value = strdup(value);
-
-       if (!procelem->filename || !procelem->value)
-               goto on_error;
+       if (!procelem->filename)
+               return ret_errno(ENOMEM);
 
-       proclist->elem = procelem;
+       procelem->value = strdup(value);
+       if (!procelem->value)
+               return ret_errno(ENOMEM);
 
-       lxc_list_add_tail(&lxc_conf->procs, proclist);
+       proclist->elem = move_ptr(procelem);
+       lxc_list_add_tail(&lxc_conf->procs, move_ptr(proclist));
 
        return 0;
-
-on_error:
-       free(proclist);
-
-       if (procelem) {
-               free(procelem->filename);
-               free(procelem->value);
-               free(procelem);
-       }
-
-       return -1;
 }
 
 static int set_config_idmaps(const char *key, const char *value,

From d1554a300e7bf05d80b90a547756c7b970b095ca Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:23:51 +0100
Subject: [PATCH 23/25] confile: cleanup set_config_idmaps()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 28 +++++++++-------------------
 1 file changed, 9 insertions(+), 19 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index a737bd778f..d74fb55d05 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -2042,29 +2042,27 @@ static int set_config_proc(const char *key, const char 
*value,
 static int set_config_idmaps(const char *key, const char *value,
                             struct lxc_conf *lxc_conf, void *data)
 {
+       __do_free struct lxc_list *idmaplist = NULL;
+       __do_free struct id_map *idmap = NULL;
        unsigned long hostid, nsid, range;
        char type;
        int ret;
-       struct lxc_list *idmaplist = NULL;
-       struct id_map *idmap = NULL;
 
        if (lxc_config_value_empty(value))
                return lxc_clear_idmaps(lxc_conf);
 
        idmaplist = malloc(sizeof(*idmaplist));
        if (!idmaplist)
-               goto on_error;
+               return ret_errno(ENOMEM);
 
        idmap = malloc(sizeof(*idmap));
        if (!idmap)
-               goto on_error;
+               return ret_errno(ENOMEM);
        memset(idmap, 0, sizeof(*idmap));
 
        ret = parse_idmaps(value, &type, &nsid, &hostid, &range);
-       if (ret < 0) {
-               ERROR("Failed to parse id mappings");
-               goto on_error;
-       }
+       if (ret < 0)
+               return log_error_errno(-EINVAL, EINVAL, "Failed to parse id 
mappings");
 
        INFO("Read uid map: type %c nsid %lu hostid %lu range %lu", type, nsid, 
hostid, range);
        if (type == 'u')
@@ -2072,13 +2070,13 @@ static int set_config_idmaps(const char *key, const 
char *value,
        else if (type == 'g')
                idmap->idtype = ID_TYPE_GID;
        else
-               goto on_error;
+               return ret_errno(EINVAL);
 
        idmap->hostid = hostid;
        idmap->nsid = nsid;
        idmap->range = range;
-       idmaplist->elem = idmap;
-       lxc_list_add_tail(&lxc_conf->id_map, idmaplist);
+       idmaplist->elem = move_ptr(idmap);
+       lxc_list_add_tail(&lxc_conf->id_map, move_ptr(idmaplist));
 
        if (!lxc_conf->root_nsuid_map && idmap->idtype == ID_TYPE_UID)
                if (idmap->nsid == 0)
@@ -2088,15 +2086,7 @@ static int set_config_idmaps(const char *key, const char 
*value,
                if (idmap->nsid == 0)
                        lxc_conf->root_nsgid_map = idmap;
 
-       idmap = NULL;
-
        return 0;
-
-on_error:
-       free(idmaplist);
-       free(idmap);
-
-       return -1;
 }
 
 static int set_config_mount_fstab(const char *key, const char *value,

From 760263a8a93d4d8aad9d0211d9cafbde062c342e Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:24:25 +0100
Subject: [PATCH 24/25] confile: cleanup set_config_mount_fstab()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index d74fb55d05..29eb350071 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -2094,7 +2094,7 @@ static int set_config_mount_fstab(const char *key, const 
char *value,
 {
        if (lxc_config_value_empty(value)) {
                clr_config_mount_fstab(key, lxc_conf, NULL);
-               return -1;
+               return ret_errno(EINVAL);
        }
 
        return set_config_path_item(&lxc_conf->fstab, value);

From ea05f3e2db8f38853f4badd98a61d0848e18ff9d Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 8 Dec 2020 15:39:35 +0100
Subject: [PATCH 25/25] confile: cleanup set_config_mount_auto()

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/confile.c | 117 +++++++++++++++++++++-------------------------
 1 file changed, 54 insertions(+), 63 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 29eb350071..8dbc8ee05f 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -2103,43 +2103,44 @@ static int set_config_mount_fstab(const char *key, 
const char *value,
 static int set_config_mount_auto(const char *key, const char *value,
                                 struct lxc_conf *lxc_conf, void *data)
 {
-       char *autos, *token;
+       __do_free char *autos = NULL;
+       char *token;
        int i;
-       int ret = -1;
        static struct {
                const char *token;
                int mask;
                int flag;
        } allowed_auto_mounts[] = {
-           { "proc",                    LXC_AUTO_PROC_MASK,   
LXC_AUTO_PROC_MIXED                                 },
-           { "proc:mixed",              LXC_AUTO_PROC_MASK,   
LXC_AUTO_PROC_MIXED                                 },
-           { "proc:rw",                 LXC_AUTO_PROC_MASK,   LXC_AUTO_PROC_RW 
                                   },
-           { "sys",                     LXC_AUTO_SYS_MASK,    
LXC_AUTO_SYS_MIXED                                  },
-           { "sys:ro",                  LXC_AUTO_SYS_MASK,    LXC_AUTO_SYS_RO  
                                   },
-           { "sys:mixed",               LXC_AUTO_SYS_MASK,    
LXC_AUTO_SYS_MIXED                                  },
-           { "sys:rw",                  LXC_AUTO_SYS_MASK,    LXC_AUTO_SYS_RW  
                                   },
-           { "cgroup",                  LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_NOSPEC                              },
-           { "cgroup:mixed",            LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_MIXED                               },
-           { "cgroup:ro",               LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_RO                                  },
-           { "cgroup:rw",               LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_RW                                  },
-           { "cgroup:force",            LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_NOSPEC | LXC_AUTO_CGROUP_FORCE      },
-           { "cgroup:mixed:force",      LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_MIXED | LXC_AUTO_CGROUP_FORCE       },
-           { "cgroup:ro:force",         LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_RO | LXC_AUTO_CGROUP_FORCE          },
-           { "cgroup:rw:force",         LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_RW | LXC_AUTO_CGROUP_FORCE          },
-           { "cgroup-full",             LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_NOSPEC                         },
-           { "cgroup-full:mixed",       LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_MIXED                          },
-           { "cgroup-full:ro",          LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_RO                             },
-           { "cgroup-full:rw",          LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_RW                             },
-           { "cgroup-full:force",       LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_NOSPEC | LXC_AUTO_CGROUP_FORCE },
-           { "cgroup-full:mixed:force", LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_MIXED | LXC_AUTO_CGROUP_FORCE  },
-           { "cgroup-full:ro:force",    LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_RO | LXC_AUTO_CGROUP_FORCE     },
-           { "cgroup-full:rw:force",    LXC_AUTO_CGROUP_MASK, 
LXC_AUTO_CGROUP_FULL_RW | LXC_AUTO_CGROUP_FORCE     },
-           { "shmounts:",               LXC_AUTO_SHMOUNTS_MASK, 
LXC_AUTO_SHMOUNTS                                 },
-           /* For adding anything that is just a single on/off, but has no
-           *  options: keep mask and flag identical and just define the enum
-           *  value as an unused bit so far
-            */
-           { NULL,                      0,                    0                
                              }
+               { "proc",                       LXC_AUTO_PROC_MASK,     
LXC_AUTO_PROC_MIXED                                     },
+               { "proc:mixed",                 LXC_AUTO_PROC_MASK,     
LXC_AUTO_PROC_MIXED                                     },
+               { "proc:rw",                    LXC_AUTO_PROC_MASK,     
LXC_AUTO_PROC_RW                                        },
+               { "sys",                        LXC_AUTO_SYS_MASK,      
LXC_AUTO_SYS_MIXED                                      },
+               { "sys:ro",                     LXC_AUTO_SYS_MASK,      
LXC_AUTO_SYS_RO                                         },
+               { "sys:mixed",                  LXC_AUTO_SYS_MASK,      
LXC_AUTO_SYS_MIXED                                      },
+               { "sys:rw",                     LXC_AUTO_SYS_MASK,      
LXC_AUTO_SYS_RW                                         },
+               { "cgroup",                     LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_NOSPEC                                  },
+               { "cgroup:mixed",               LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_MIXED                                   },
+               { "cgroup:ro",                  LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_RO                                      },
+               { "cgroup:rw",                  LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_RW                                      },
+               { "cgroup:force",               LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_NOSPEC | LXC_AUTO_CGROUP_FORCE          },
+               { "cgroup:mixed:force",         LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_MIXED | LXC_AUTO_CGROUP_FORCE           },
+               { "cgroup:ro:force",            LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_RO | LXC_AUTO_CGROUP_FORCE              },
+               { "cgroup:rw:force",            LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_RW | LXC_AUTO_CGROUP_FORCE              },
+               { "cgroup-full",                LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_NOSPEC                             },
+               { "cgroup-full:mixed",          LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_MIXED                              },
+               { "cgroup-full:ro",             LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_RO                                 },
+               { "cgroup-full:rw",             LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_RW                                 },
+               { "cgroup-full:force",          LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_NOSPEC | LXC_AUTO_CGROUP_FORCE     },
+               { "cgroup-full:mixed:force",    LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_MIXED | LXC_AUTO_CGROUP_FORCE      },
+               { "cgroup-full:ro:force",       LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_RO | LXC_AUTO_CGROUP_FORCE         },
+               { "cgroup-full:rw:force",       LXC_AUTO_CGROUP_MASK,   
LXC_AUTO_CGROUP_FULL_RW | LXC_AUTO_CGROUP_FORCE         },
+               { "shmounts:",                  LXC_AUTO_SHMOUNTS_MASK, 
LXC_AUTO_SHMOUNTS                                       },
+               /*
+                * For adding anything that is just a single on/off, but has no
+                * options: keep mask and flag identical and just define the
+                * enum value as an unused bit so far
+                */
+               { NULL,                         0,                      0       
                                                }
        };
 
        if (lxc_config_value_empty(value)) {
@@ -2149,7 +2150,7 @@ static int set_config_mount_auto(const char *key, const 
char *value,
 
        autos = strdup(value);
        if (!autos)
-               return -1;
+               return ret_errno(ENOMEM);
 
        lxc_iterate_parts(token, autos, " \t") {
                bool is_shmounts = false;
@@ -2165,50 +2166,40 @@ static int set_config_mount_auto(const char *key, const 
char *value,
                        }
                }
 
-               if (!allowed_auto_mounts[i].token) {
-                       ERROR("Invalid filesystem to automount \"%s\"", token);
-                       goto on_error;
-               }
+               if (!allowed_auto_mounts[i].token)
+                       return log_error_errno(-EINVAL, EINVAL, "Invalid 
filesystem to automount \"%s\"", token);
 
                lxc_conf->auto_mounts &= ~allowed_auto_mounts[i].mask;
                lxc_conf->auto_mounts |= allowed_auto_mounts[i].flag;
 
                if (is_shmounts) {
-                       char *container_path;
-                       char *host_path;
+                       __do_free char *container_path = NULL, *host_path = 
NULL;
+                       char *val;
 
-                       host_path = token + STRLITERALLEN("shmounts:");
-                       if (*host_path == '\0') {
-                               SYSERROR("Failed to copy shmounts host path");
-                               goto on_error;
-                       }
+                       val = token + STRLITERALLEN("shmounts:");
+                       if (*val == '\0')
+                               return log_error_errno(-EINVAL, EINVAL, "Failed 
to copy shmounts host path");
+
+                       host_path = strdup(val);
+                       if (!host_path)
+                               return log_error_errno(-EINVAL, EINVAL, "Failed 
to copy shmounts host path");
 
-                       container_path = strchr(host_path, ':');
-                       if (!container_path || *(container_path + 1) == '\0')
-                               container_path = "/dev/.lxc-mounts";
+                       val = strchr(host_path, ':');
+                       if (!val || *(val + 1) == '\0')
+                               val = "/dev/.lxc-mounts";
                        else
-                               *container_path++ = '\0';
+                               *val++ = '\0';
 
-                       lxc_conf->shmount.path_host = strdup(host_path);
-                       if (!lxc_conf->shmount.path_host) {
-                               SYSERROR("Failed to copy shmounts host path");
-                               goto on_error;
-                       }
+                       container_path = strdup(val);
+                       if(!container_path)
+                               return log_error_errno(-EINVAL, EINVAL, "Failed 
to copy shmounts container path");
 
-                       lxc_conf->shmount.path_cont = strdup(container_path);
-                       if(!lxc_conf->shmount.path_cont) {
-                               SYSERROR("Failed to copy shmounts container 
path");
-                               goto on_error;
-                       }
+                       lxc_conf->shmount.path_host = move_ptr(host_path);
+                       lxc_conf->shmount.path_cont = move_ptr(container_path);
                }
        }
 
-       ret = 0;
-
-on_error:
-       free(autos);
-
-       return ret;
+       return 0;
 }
 
 static int set_config_mount(const char *key, const char *value,
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to