From: Christian Brauner Date: Sun, 11 Jun 2017 03:44:52 +0000 (+0200) Subject: {start,lxccontainer}: add lxc_free_handler() X-Git-Tag: lxc-2.1.0~98^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f2e07cb6a4def116c5e2ab4027d15c196785228a;p=thirdparty%2Flxc.git {start,lxccontainer}: add lxc_free_handler() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 1bed3833d..ad35605a4 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -792,8 +792,10 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a char title[2048]; pid_t pid = fork(); - if (pid < 0) + if (pid < 0) { + lxc_free_handler(handler); return false; + } if (pid != 0) { /* Set to NULL because we don't want father unlink @@ -834,6 +836,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a } else { if (!am_single_threaded()) { ERROR("Cannot start non-daemonized container when threaded"); + lxc_free_handler(handler); return false; } } @@ -846,6 +849,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a if (pid_fp == NULL) { SYSERROR("Failed to create pidfile '%s' for '%s'", c->pidfile, c->name); + lxc_free_handler(handler); if (daemonize) exit(1); return false; @@ -855,6 +859,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a SYSERROR("Failed to write '%s'", c->pidfile); fclose(pid_fp); pid_fp = NULL; + lxc_free_handler(handler); if (daemonize) exit(1); return false; @@ -870,10 +875,12 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a if (conf->monitor_unshare) { if (unshare(CLONE_NEWNS)) { SYSERROR("failed to unshare mount namespace"); + lxc_free_handler(handler); return false; } if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL)) { SYSERROR("Failed to make / rslave at startup"); + lxc_free_handler(handler); return false; } } @@ -888,6 +895,7 @@ reboot: if (lxc_check_inherited(conf, daemonize, handler->conf->maincmd_fd)) { ERROR("Inherited fds found"); + lxc_free_handler(handler); ret = 1; goto out; } diff --git a/src/lxc/start.c b/src/lxc/start.c index 0b5c85b1a..83c815144 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -451,6 +451,18 @@ out_sigfd: return -1; } +void lxc_free_handler(struct lxc_handler *handler) +{ + if (handler->conf && handler->conf->maincmd_fd) + close(handler->conf->maincmd_fd); + + if (handler->name) + free(handler->name); + + handler->conf = NULL; + free(handler); +} + struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf, const char *lxcpath) { @@ -477,12 +489,12 @@ struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf, handler->name = strdup(name); if (!handler->name) { ERROR("failed to allocate memory"); - goto do_partial_cleanup; + goto on_error; } if (lxc_cmd_init(name, handler, lxcpath)) { ERROR("failed to set up command socket"); - goto do_full_cleanup; + goto on_error; } TRACE("unix domain socket %d for command server is ready", @@ -490,11 +502,8 @@ struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf, return handler; -do_full_cleanup: - free(handler->name); - -do_partial_cleanup: - free(handler); +on_error: + lxc_free_handler(handler); return NULL; } diff --git a/src/lxc/start.h b/src/lxc/start.h index aa723537d..103f15b67 100644 --- a/src/lxc/start.h +++ b/src/lxc/start.h @@ -69,6 +69,7 @@ extern void lxc_abort(const char *name, struct lxc_handler *handler); extern struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf, const char *lxcpath); +extern void lxc_free_handler(struct lxc_handler *handler); extern int lxc_init(const char *name, struct lxc_handler *handler); extern void lxc_fini(const char *name, struct lxc_handler *handler);