Unverified Commit 965502a0 by Stéphane Graber Committed by GitHub

Merge pull request #3775 from brauner/2021-04-07/fixes

confile: make lxc_get_config() and lxc_get_config_net() always return…
parents 33c0a546 6773e108
...@@ -1005,9 +1005,6 @@ static int lxc_cmd_get_config_item_callback(int fd, struct lxc_cmd_req *req, ...@@ -1005,9 +1005,6 @@ static int lxc_cmd_get_config_item_callback(int fd, struct lxc_cmd_req *req,
memset(&rsp, 0, sizeof(rsp)); memset(&rsp, 0, sizeof(rsp));
item = lxc_get_config(req->data); item = lxc_get_config(req->data);
if (!item)
goto err1;
cilen = item->get(req->data, NULL, 0, handler->conf, NULL); cilen = item->get(req->data, NULL, 0, handler->conf, NULL);
if (cilen <= 0) if (cilen <= 0)
goto err1; goto err1;
......
...@@ -82,6 +82,7 @@ lxc_config_define(console_logfile); ...@@ -82,6 +82,7 @@ lxc_config_define(console_logfile);
lxc_config_define(console_path); lxc_config_define(console_path);
lxc_config_define(console_rotate); lxc_config_define(console_rotate);
lxc_config_define(console_size); lxc_config_define(console_size);
lxc_config_define(unsupported_key);
lxc_config_define(environment); lxc_config_define(environment);
lxc_config_define(ephemeral); lxc_config_define(ephemeral);
lxc_config_define(execute_cmd); lxc_config_define(execute_cmd);
...@@ -158,6 +159,24 @@ lxc_config_define(uts_name); ...@@ -158,6 +159,24 @@ lxc_config_define(uts_name);
lxc_config_define(sysctl); lxc_config_define(sysctl);
lxc_config_define(proc); 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: * Important Note:
* If a new config option is added to this table, be aware that * If a new config option is added to this table, be aware that
...@@ -257,6 +276,14 @@ static struct lxc_config_t config_jump_table[] = { ...@@ -257,6 +276,14 @@ static struct lxc_config_t config_jump_table[] = {
{ "lxc.proc", false, set_config_proc, get_config_proc, clr_config_proc, }, { "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 { struct lxc_config_net_t {
LXC_CONFIG_MEMBERS; LXC_CONFIG_MEMBERS;
}; };
...@@ -289,6 +316,14 @@ static struct lxc_config_net_t config_jump_table_net[] = { ...@@ -289,6 +316,14 @@ static struct lxc_config_net_t config_jump_table_net[] = {
{ "veth.vlan.tagged.id", true, set_config_net_veth_vlan_tagged_id, get_config_net_veth_vlan_tagged_id, clr_config_net_veth_vlan_tagged_id, }, { "veth.vlan.tagged.id", true, set_config_net_veth_vlan_tagged_id, get_config_net_veth_vlan_tagged_id, clr_config_net_veth_vlan_tagged_id, },
}; };
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) struct lxc_config_t *lxc_get_config_exact(const char *key)
{ {
size_t i; size_t i;
...@@ -327,13 +362,13 @@ struct lxc_config_t *lxc_get_config(const char *key) ...@@ -327,13 +362,13 @@ struct lxc_config_t *lxc_get_config(const char *key)
case 0: case 0:
continue; continue;
case -E2BIG: case -E2BIG:
return NULL; return &unsupported_config_key;
} }
return cur; return cur;
} }
return NULL; return &unsupported_config_key;
} }
static inline bool match_config_net_item(const struct lxc_config_net_t *entry, static inline bool match_config_net_item(const struct lxc_config_net_t *entry,
...@@ -355,7 +390,7 @@ static struct lxc_config_net_t *lxc_get_config_net(const char *key) ...@@ -355,7 +390,7 @@ static struct lxc_config_net_t *lxc_get_config_net(const char *key)
return cur; return cur;
} }
return NULL; return &unsupported_config_net_key;
} }
static int set_config_net(const char *key, const char *value, static int set_config_net(const char *key, const char *value,
...@@ -3037,9 +3072,6 @@ static int parse_line(char *buffer, void *data) ...@@ -3037,9 +3072,6 @@ static int parse_line(char *buffer, void *data)
} }
config = lxc_get_config(key); 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); return config->set(key, value, plc->conf, NULL);
} }
...@@ -5363,7 +5395,7 @@ static int get_network_config_ops(const char *key, struct lxc_conf *lxc_conf, ...@@ -5363,7 +5395,7 @@ static int get_network_config_ops(const char *key, struct lxc_conf *lxc_conf,
/* lxc.net.<idx>.<subkey> */ /* lxc.net.<idx>.<subkey> */
info->ops = lxc_get_config_net(info->subkey); 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 syserror_set(-ENOENT, "Unknown network configuration key \"%s\"", key);
return 0; return 0;
......
...@@ -2230,12 +2230,8 @@ static bool do_lxcapi_clear_config_item(struct lxc_container *c, ...@@ -2230,12 +2230,8 @@ static bool do_lxcapi_clear_config_item(struct lxc_container *c,
return false; return false;
config = lxc_get_config(key); 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) if (!ret)
do_clear_unexp_config_line(c->lxc_conf, key); 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 ...@@ -2571,11 +2567,8 @@ static int do_lxcapi_get_config_item(struct lxc_container *c, const char *key, c
return -1; return -1;
config = lxc_get_config(key); config = lxc_get_config(key);
/* Verify that the config key exists and that it has a callback
* implemented. ret = config->get(key, retv, inlen, c->lxc_conf, NULL);
*/
if (config && config->get)
ret = config->get(key, retv, inlen, c->lxc_conf, NULL);
container_mem_unlock(c); container_mem_unlock(c);
return ret; return ret;
...@@ -3138,8 +3131,6 @@ int lxc_set_config_item_locked(struct lxc_conf *conf, const char *key, ...@@ -3138,8 +3131,6 @@ int lxc_set_config_item_locked(struct lxc_conf *conf, const char *key,
bool bret = true; bool bret = true;
config = lxc_get_config(key); config = lxc_get_config(key);
if (!config)
return -EINVAL;
ret = config->set(key, v, conf, NULL); ret = config->set(key, v, conf, NULL);
if (ret < 0) if (ret < 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment