Skip to content

Commit

Permalink
{start,lxccontainer}: add lxc_free_handler()
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Jun 13, 2017
1 parent dbc9832 commit f2e07cb
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 8 deletions.
10 changes: 9 additions & 1 deletion src/lxc/lxccontainer.c
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
}
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
}
}
Expand All @@ -888,6 +895,7 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a

if (lxc_check_inherited(conf, daemonize, handler->conf->maincmd_fd)) {
ERROR("Inherited fds found");
lxc_free_handler(handler);
ret = 1;
goto out;
}
Expand Down
23 changes: 16 additions & 7 deletions src/lxc/start.c
Expand Up @@ -451,6 +451,18 @@ int lxc_poll(const char *name, struct lxc_handler *handler)
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)
{
Expand All @@ -477,24 +489,21 @@ 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",
handler->conf->maincmd_fd);

return handler;

do_full_cleanup:
free(handler->name);

do_partial_cleanup:
free(handler);
on_error:
lxc_free_handler(handler);

return NULL;
}
Expand Down
1 change: 1 addition & 0 deletions src/lxc/start.h
Expand Up @@ -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);

Expand Down

0 comments on commit f2e07cb

Please sign in to comment.