Quoting Tycho Andersen (tycho.ander...@canonical.com): > We can also narrow the scope of this, since we only need it in the process > that > is actually going to use it. > > Reported-by: Serge Hallyn <serge.hal...@ubuntu.com> > Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
Thanks Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com> > --- > src/lxc/lxccontainer.c | 43 ++++++++++++++++++++++++++----------------- > src/lxc/start.c | 2 +- > src/lxc/start.h | 1 + > 3 files changed, 28 insertions(+), 18 deletions(-) > > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c > index 6d45c8e..cd0f7df 100644 > --- a/src/lxc/lxccontainer.c > +++ b/src/lxc/lxccontainer.c > @@ -3843,12 +3843,6 @@ static bool lxcapi_restore(struct lxc_container *c, > char *directory, bool verbos > if (!tmpnam(pidfile)) > return false; > > - struct lxc_handler *handler; > - > - handler = lxc_init(c->name, c->lxc_conf, c->config_path); > - if (!handler) > - return false; > - > pid = fork(); > if (pid < 0) > return false; > @@ -3890,6 +3884,9 @@ static bool lxcapi_restore(struct lxc_container *c, > char *directory, bool verbos > exit(1); > } else { > int status; > + struct lxc_handler *handler; > + bool error = false; > + > pid_t w = waitpid(pid, &status, 0); > > if (w == -1) { > @@ -3897,29 +3894,37 @@ static bool lxcapi_restore(struct lxc_container *c, > char *directory, bool verbos > return false; > } > > + handler = lxc_init(c->name, c->lxc_conf, c->config_path); > + if (!handler) > + return false; > + > if (WIFEXITED(status)) { > if (WEXITSTATUS(status)) { > - return false; > + error = true; > + goto out_fini_handler; > } > else { > int netnr = 0, ret; > - bool error = false; > FILE *f = fopen(pidfile, "r"); > if (!f) { > + error = true; > perror("reading pidfile"); > ERROR("couldn't read restore's init > pidfile %s\n", pidfile); > - return false; > + goto out_fini_handler; > } > > ret = fscanf(f, "%d", (int*) &handler->pid); > fclose(f); > if (ret != 1) { > + error = true; > ERROR("reading restore pid failed"); > - return false; > + goto out_fini_handler; > } > > - if (container_mem_lock(c)) > - return false; > + if (container_mem_lock(c)) { > + error = true; > + goto out_fini_handler; > + } > > lxc_list_for_each(it, &c->lxc_conf->network) { > char eth[128], veth[128]; > @@ -3943,10 +3948,12 @@ static bool lxcapi_restore(struct lxc_container *c, > char *directory, bool verbos > out_unlock: > container_mem_unlock(c); > if (error) > - return false; > + goto out_fini_handler; > > - if (lxc_set_state(c->name, handler, RUNNING)) > - return false; > + if (lxc_set_state(c->name, handler, RUNNING)) { > + error = true; > + goto out_fini_handler; > + } > } > } > > @@ -3954,9 +3961,11 @@ out_unlock: > lxc_abort(c->name, handler); > return false; > } > - } > > - return true; > +out_fini_handler: > + lxc_fini(c->name, handler); > + return !error; > + } > } > > static int lxcapi_attach_run_waitl(struct lxc_container *c, > lxc_attach_options_t *options, const char *program, const char *arg, ...) > diff --git a/src/lxc/start.c b/src/lxc/start.c > index 98849e1..f931bfa 100644 > --- a/src/lxc/start.c > +++ b/src/lxc/start.c > @@ -460,7 +460,7 @@ out_free: > return NULL; > } > > -static void lxc_fini(const char *name, struct lxc_handler *handler) > +void lxc_fini(const char *name, struct lxc_handler *handler) > { > /* The STOPPING state is there for future cleanup code > * which can take awhile > diff --git a/src/lxc/start.h b/src/lxc/start.h > index 8af0a06..7c75b16 100644 > --- a/src/lxc/start.h > +++ b/src/lxc/start.h > @@ -79,6 +79,7 @@ extern int lxc_poll(const char *name, struct lxc_handler > *handler); > extern int lxc_set_state(const char *name, struct lxc_handler *handler, > lxc_state_t state); > extern void lxc_abort(const char *name, struct lxc_handler *handler); > extern struct lxc_handler *lxc_init(const char *name, struct lxc_conf *, > const char *); > +extern void lxc_fini(const char *name, struct lxc_handler *handler); > > extern int lxc_check_inherited(struct lxc_conf *conf, int fd_to_ignore); > int __lxc_start(const char *, struct lxc_conf *, struct lxc_operations *, > -- > 1.9.1 > > _______________________________________________ > lxc-devel mailing list > lxc-devel@lists.linuxcontainers.org > http://lists.linuxcontainers.org/listinfo/lxc-devel _______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel