From 933acfaa431ed4d28bb3301dec0eae9cc375b422 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Wed, 7 Apr 2021 16:51:31 +0200 Subject: [PATCH] confile: make lxc_get_config() and lxc_get_config_net() always return non-NULL Introduce the concept of an unsupported config item. Signed-off-by: Christian Brauner --- src/lxc/commands.c | 3 --- src/lxc/confile.c | 46 +++++++++++++++++++++++++++++++++++------- src/lxc/lxccontainer.c | 15 +++----------- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 37e2282e80..08f4dea86b 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -1005,9 +1005,6 @@ static int lxc_cmd_get_config_item_callback(int fd, struct lxc_cmd_req *req, memset(&rsp, 0, sizeof(rsp)); item = lxc_get_config(req->data); - if (!item) - goto err1; - cilen = item->get(req->data, NULL, 0, handler->conf, NULL); if (cilen <= 0) goto err1; diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 2cf0393d5a..0a02b44b65 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -77,6 +77,7 @@ lxc_config_define(console_logfile); lxc_config_define(console_path); lxc_config_define(console_rotate); lxc_config_define(console_size); +lxc_config_define(unsupported_key); lxc_config_define(environment); lxc_config_define(ephemeral); lxc_config_define(execute_cmd); @@ -148,6 +149,24 @@ lxc_config_define(uts_name); lxc_config_define(sysctl); lxc_config_define(proc); +static int set_config_unsupported_key(const char *key, const char *value, + struct lxc_conf *lxc_conf, void *data) +{ + return syserror_set(-EINVAL, "Unsupported config key \"%s\"", key); +} + +static int get_config_unsupported_key(const char *key, char *retv, int inlen, + struct lxc_conf *c, void *data) +{ + return syserror_set(-EINVAL, "Unsupported config key \"%s\"", key); +} + +static int clr_config_unsupported_key(const char *key, + struct lxc_conf *lxc_conf, void *data) +{ + return syserror_set(-EINVAL, "Unsupported config key \"%s\"", key); +} + /* * Important Note: * If a new config option is added to this table, be aware that @@ -240,6 +259,14 @@ static struct lxc_config_t config_jump_table[] = { { "lxc.proc", false, set_config_proc, get_config_proc, clr_config_proc, }, }; +static struct lxc_config_t unsupported_config_key = { + NULL, + false, + set_config_unsupported_key, + get_config_unsupported_key, + clr_config_unsupported_key, +}; + struct lxc_config_net_t { LXC_CONFIG_MEMBERS; }; @@ -270,6 +297,14 @@ static struct lxc_config_net_t config_jump_table_net[] = { { "veth.ipv6.route", true, set_config_net_veth_ipv6_route, get_config_net_veth_ipv6_route, clr_config_net_veth_ipv6_route, }, }; +static struct lxc_config_net_t unsupported_config_net_key = { + NULL, + false, + set_config_unsupported_key, + get_config_unsupported_key, + clr_config_unsupported_key, +}; + struct lxc_config_t *lxc_get_config_exact(const char *key) { size_t i; @@ -308,13 +343,13 @@ struct lxc_config_t *lxc_get_config(const char *key) case 0: continue; case -E2BIG: - return NULL; + return &unsupported_config_key; } return cur; } - return NULL; + return &unsupported_config_key; } static inline bool match_config_net_item(const struct lxc_config_net_t *entry, @@ -336,7 +371,7 @@ static struct lxc_config_net_t *lxc_get_config_net(const char *key) return cur; } - return NULL; + return &unsupported_config_net_key; } static int set_config_net(const char *key, const char *value, @@ -2749,9 +2784,6 @@ static int parse_line(char *buffer, void *data) } config = lxc_get_config(key); - if (!config) - return log_error_errno(-EINVAL, EINVAL, "Unknown configuration key \"%s\"", key); - return config->set(key, value, plc->conf, NULL); } @@ -4893,7 +4925,7 @@ static int get_network_config_ops(const char *key, struct lxc_conf *lxc_conf, /* lxc.net.. */ info->ops = lxc_get_config_net(info->subkey); - if (!info->ops) + if (info->ops == &unsupported_config_net_key) return syserror_set(-ENOENT, "Unknown network configuration key \"%s\"", key); return 0; diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index ec54a96eb0..58c24d3934 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -2230,12 +2230,8 @@ static bool do_lxcapi_clear_config_item(struct lxc_container *c, return false; config = lxc_get_config(key); - /* Verify that the config key exists and that it has a callback - * implemented. - */ - if (config && config->clr) - ret = config->clr(key, c->lxc_conf, NULL); + ret = config->clr(key, c->lxc_conf, NULL); if (!ret) do_clear_unexp_config_line(c->lxc_conf, key); @@ -2571,11 +2567,8 @@ static int do_lxcapi_get_config_item(struct lxc_container *c, const char *key, c return -1; config = lxc_get_config(key); - /* Verify that the config key exists and that it has a callback - * implemented. - */ - if (config && config->get) - ret = config->get(key, retv, inlen, c->lxc_conf, NULL); + + ret = config->get(key, retv, inlen, c->lxc_conf, NULL); container_mem_unlock(c); return ret; @@ -3138,8 +3131,6 @@ int lxc_set_config_item_locked(struct lxc_conf *conf, const char *key, bool bret = true; config = lxc_get_config(key); - if (!config) - return -EINVAL; ret = config->set(key, v, conf, NULL); if (ret < 0)