diff --git a/src/lxc/conf.c b/src/lxc/conf.c index dfdff54a5..c110f6a27 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2556,3 +2556,21 @@ int lxc_clear_hooks(struct lxc_conf *c) } return 0; } + +void lxc_conf_free(struct lxc_conf *conf) +{ + if (!conf) + return; + if (conf->console.path) + free(conf->console.path); + if (conf->rootfs.mount != LXCROOTFSMOUNT) + free(conf->rootfs.mount); + lxc_clear_config_network(conf); + if (conf->aa_profile) + free(conf->aa_profile); + lxc_clear_config_caps(conf); + lxc_clear_cgroups(conf, "lxc.cgroup"); + lxc_clear_hooks(conf); + lxc_clear_mount_entries(conf); + free(conf); +} diff --git a/src/lxc/conf.h b/src/lxc/conf.h index 0c39916c9..dcf79fe5c 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -245,6 +245,7 @@ int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf); * Initialize the lxc configuration structure */ extern struct lxc_conf *lxc_conf_init(void); +extern void lxc_conf_free(struct lxc_conf *conf); extern int pin_rootfs(const char *rootfs); diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 471fecc2d..c8dc8c483 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -215,6 +215,15 @@ static pid_t lxcapi_init_pid(struct lxc_container *c) return ret; } +static bool load_config_locked(struct lxc_container *c, char *fname) +{ + if (!c->lxc_conf) + c->lxc_conf = lxc_conf_init(); + if (c->lxc_conf && !lxc_config_read(fname, c->lxc_conf)) + return true; + return false; +} + static bool lxcapi_load_config(struct lxc_container *c, char *alt_file) { bool ret = false; @@ -229,10 +238,7 @@ static bool lxcapi_load_config(struct lxc_container *c, char *alt_file) return false; if (lxclock(c->slock, 0)) return false; - if (!c->lxc_conf) - c->lxc_conf = lxc_conf_init(); - if (c->lxc_conf && !lxc_config_read(fname, c->lxc_conf)) - ret = true; + ret = load_config_locked(c, fname); lxcunlock(c->slock); return ret; } @@ -596,11 +602,18 @@ again: goto out_unlock; } - if (WEXITSTATUS(status) != 0) + if (WEXITSTATUS(status) != 0) { ERROR("container creation template for %s exited with %d\n", c->name, WEXITSTATUS(status)); - else - bret = true; + goto out_unlock; + } + + // now clear out the lxc_conf we have, reload from the created + // container + if (c->lxc_conf) + lxc_conf_free(c->lxc_conf); + c->lxc_conf = NULL; + bret = load_config_locked(c, c->configfile); out_unlock: lxcunlock(c->slock);