Commit 493c6236 by Serge Hallyn Committed by GitHub

Merge pull request #1596 from brauner/2017-05-29/fix_parsing

confile: fix parsing
parents 1573a514 ae4ad10d
......@@ -534,14 +534,18 @@ static int lxc_cmd_get_config_item_callback(int fd, struct lxc_cmd_req *req,
int cilen;
struct lxc_cmd_rsp rsp;
char *cidata;
struct lxc_config_t *item;
memset(&rsp, 0, sizeof(rsp));
cilen = lxc_get_config_item(handler->conf, req->data, NULL, 0);
item = lxc_getconfig(req->data);
if (!item)
goto err1;
cilen = item->get(req->data, NULL, 0, handler->conf);
if (cilen <= 0)
goto err1;
cidata = alloca(cilen + 1);
if (lxc_get_config_item(handler->conf, req->data, cidata, cilen + 1) != cilen)
if (item->get(req->data, cidata, cilen + 1, handler->conf) != cilen)
goto err1;
cidata[cilen] = '\0';
rsp.data = cidata;
......
......@@ -4565,7 +4565,7 @@ static inline void lxc_clear_aliens(struct lxc_conf *conf)
}
}
static inline void lxc_clear_includes(struct lxc_conf *conf)
void lxc_clear_includes(struct lxc_conf *conf)
{
struct lxc_list *it,*next;
......@@ -4961,82 +4961,3 @@ struct lxc_list *sort_cgroup_settings(struct lxc_list* cgroup_settings)
return result;
}
int lxc_clear_simple_config_item(struct lxc_conf *c, const char *key)
{
if (strcmp(key, "lxc.utsname") == 0) {
free(c->utsname);
c->utsname = NULL;
} else if (strcmp(key, "lxc.arch") == 0) {
c->personality = -1;
} else if (strcmp(key, "lxc.haltsignal") == 0) {
c->haltsignal = 0;
} else if (strcmp(key, "lxc.rebootsignal") == 0) {
c->rebootsignal = 0;
} else if (strcmp(key, "lxc.stopsignal") == 0) {
c->stopsignal = 0;
} else if (strcmp(key, "lxc.init_cmd") == 0) {
free(c->init_cmd);
c->init_cmd = NULL;
} else if (strcmp(key, "lxc.init_uid") == 0) {
c->init_uid = 0;
} else if (strcmp(key, "lxc.init_gid") == 0) {
c->init_gid = 0;
} else if (strcmp(key, "lxc.ephemeral") == 0) {
c->ephemeral = 0;
} else if (strcmp(key, "lxc.console.logfile") == 0) {
free(c->console.log_path);
c->console.log_path = NULL;
} else if (strcmp(key, "lxc.console") == 0) {
free(c->console.path);
c->console.path = NULL;
} else if (strcmp(key, "lxc.tty") == 0) {
c->tty = 0;
} else if (strcmp(key, "lxc.devttydir") == 0) {
free(c->ttydir);
c->ttydir = NULL;
} else if (strcmp(key, "lxc.autodev") == 0) {
c->autodev = 1;
} else if (strcmp(key, "lxc.kmsg") == 0) {
c->kmsg = 0;
} else if (strcmp(key, "lxc.mount") == 0) {
free(c->fstab);
c->fstab = NULL;
} else if (strcmp(key, "lxc.rootfs") == 0) {
free(c->rootfs.path);
c->rootfs.path = NULL;
} else if (strcmp(key, "lxc.rootfs.mount") == 0) {
free(c->rootfs.mount);
c->rootfs.mount = NULL;
} else if (strcmp(key, "lxc.rootfs.options") == 0) {
free(c->rootfs.options);
c->rootfs.options = NULL;
} else if (strcmp(key, "lxc.rootfs.backend") == 0) {
free(c->rootfs.bdev_type);
c->rootfs.bdev_type = NULL;
} else if (strcmp(key, "lxc.aa_profile") == 0) {
free(c->lsm_aa_profile);
c->lsm_aa_profile = NULL;
} else if (strcmp(key, "lxc.aa_allow_incomplete") == 0) {
c->lsm_aa_allow_incomplete = 0;
} else if (strcmp(key, "lxc.se_context") == 0) {
free(c->lsm_se_context);
c->lsm_se_context = NULL;
} else if (strcmp(key, "lxc.seccomp") == 0) {
free(c->seccomp);
c->seccomp = NULL;
} else if (strcmp(key, "lxc.loglevel") == 0) {
c->loglevel = LXC_LOG_PRIORITY_NOTSET;
} else if (strcmp(key, "lxc.logfile") == 0) {
free(c->logfile);
c->logfile = NULL;
} else if (strcmp(key, "lxc.monitor.unshare") == 0) {
c->monitor_unshare = 0;
} else if (strcmp(key, "lxc.pts") == 0) {
c->pts = 0;
} else {
return -1;
}
return 0;
}
......@@ -453,7 +453,7 @@ extern int lxc_clear_groups(struct lxc_conf *c);
extern int lxc_clear_environment(struct lxc_conf *c);
extern int lxc_clear_limits(struct lxc_conf *c, const char *key);
extern int lxc_delete_autodev(struct lxc_handler *handler);
extern int lxc_clear_simple_config_item(struct lxc_conf *c, const char *key);
extern void lxc_clear_includes(struct lxc_conf *conf);
extern int do_rootfs_setup(struct lxc_conf *conf, const char *name,
const char *lxcpath);
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -31,10 +31,14 @@
struct lxc_conf;
struct lxc_list;
typedef int (*config_cb)(const char *, const char *, struct lxc_conf *);
typedef int (*config_set_cb)(const char *, const char *, struct lxc_conf *);
typedef int (*config_get_cb)(const char *, char *, int, struct lxc_conf *);
typedef int (*config_clr_cb)(const char *key, struct lxc_conf *c);
struct lxc_config_t {
char *name;
config_cb cb;
config_set_cb set;
config_get_cb get;
config_clr_cb clr;
};
extern struct lxc_config_t *lxc_getconfig(const char *key);
......@@ -51,7 +55,6 @@ extern int lxc_config_define_load(struct lxc_list *defines,
extern signed long lxc_config_parse_arch(const char *arch);
extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);
extern int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv, int inlen);
extern int lxc_clear_config_item(struct lxc_conf *c, const char *key);
extern void write_config(FILE *fout, struct lxc_conf *c);
......
......@@ -1676,17 +1676,27 @@ static void do_clear_unexp_config_line(struct lxc_conf *conf, const char *key)
WARN("Error clearing configuration for %s", key);
}
static bool do_lxcapi_clear_config_item(struct lxc_container *c, const char *key)
static bool do_lxcapi_clear_config_item(struct lxc_container *c,
const char *key)
{
int ret;
int ret = 1;
struct lxc_config_t *config;
if (!c || !c->lxc_conf)
return false;
if (container_mem_lock(c))
return false;
ret = lxc_clear_config_item(c->lxc_conf, key);
config = lxc_getconfig(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);
if (!ret)
do_clear_unexp_config_line(c->lxc_conf, key);
container_mem_unlock(c);
return ret == 0;
}
......@@ -1985,13 +1995,22 @@ WRAP_API_3(char **, lxcapi_get_ips, const char *, const char *, int)
static int do_lxcapi_get_config_item(struct lxc_container *c, const char *key, char *retv, int inlen)
{
int ret;
int ret = -1;
struct lxc_config_t *config;
if (!c || !c->lxc_conf)
return -1;
if (container_mem_lock(c))
return -1;
ret = lxc_get_config_item(c->lxc_conf, key, retv, inlen);
config = lxc_getconfig(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);
container_mem_unlock(c);
return ret;
}
......@@ -2461,7 +2480,7 @@ static bool set_config_item_locked(struct lxc_container *c, const char *key, con
config = lxc_getconfig(key);
if (!config)
return false;
if (config->cb(key, v, c->lxc_conf) != 0)
if (config->set(key, v, c->lxc_conf) != 0)
return false;
return do_append_unexp_config_line(c->lxc_conf, key, v);
}
......
......@@ -2021,6 +2021,29 @@ int lxc_safe_uint(const char *numstr, unsigned int *converted)
return 0;
}
int lxc_safe_ulong(const char *numstr, unsigned long *converted)
{
char *err = NULL;
unsigned long int uli;
while (isspace(*numstr))
numstr++;
if (*numstr == '-')
return -EINVAL;
errno = 0;
uli = strtoul(numstr, &err, 0);
if (errno == ERANGE && uli == ULONG_MAX)
return -ERANGE;
if (err == numstr || *err != '\0')
return -EINVAL;
*converted = uli;
return 0;
}
int lxc_safe_int(const char *numstr, int *converted)
{
char *err = NULL;
......
......@@ -340,6 +340,7 @@ bool task_blocking_signal(pid_t pid, int signal);
int lxc_safe_uint(const char *numstr, unsigned int *converted);
int lxc_safe_int(const char *numstr, int *converted);
int lxc_safe_long(const char *numstr, long int *converted);
int lxc_safe_ulong(const char *numstr, unsigned long *converted);
/* Switch to a new uid and gid. */
int lxc_switch_uid_gid(uid_t uid, gid_t gid);
......
......@@ -24,6 +24,7 @@ lxc_test_attach_SOURCES = attach.c
lxc_test_device_add_remove_SOURCES = device_add_remove.c
lxc_test_apparmor_SOURCES = aa.c
lxc_test_utils_SOURCES = lxc-test-utils.c lxctest.h
lxc_test_parse_config_file_SOURCES = parse_config_file.c lxctest.h
AM_CFLAGS=-DLXCROOTFSMOUNT=\"$(LXCROOTFSMOUNT)\" \
-DLXCPATH=\"$(LXCPATH)\" \
......@@ -51,7 +52,7 @@ bin_PROGRAMS = lxc-test-containertests lxc-test-locktests lxc-test-startone \
lxc-test-cgpath lxc-test-clonetest lxc-test-console \
lxc-test-snapshot lxc-test-concurrent lxc-test-may-control \
lxc-test-reboot lxc-test-list lxc-test-attach lxc-test-device-add-remove \
lxc-test-apparmor lxc-test-utils
lxc-test-apparmor lxc-test-utils lxc-test-parse-config-file
bin_SCRIPTS = lxc-test-automount \
lxc-test-autostart \
......@@ -101,6 +102,7 @@ EXTRA_DIST = \
lxc-test-unpriv \
lxc-test-utils.c \
may_control.c \
parse_config_file.c \
saveconfig.c \
shutdowntest.c \
snapshot.c \
......@@ -108,3 +110,4 @@ EXTRA_DIST = \
clean-local:
rm -f lxc-test-utils-*
rm -f lxc-parse-config-file-*
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