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