Commit 13353dc4 by Serge Hallyn

daemonized start: exit children on failure, don't return

When starting a daemonized container, only the original parent thread should return to the caller. The first forked child immediately exits after forking, but the grandparent child was in some places returning on error - causing a second instance of the calling function. Signed-off-by: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com> Acked-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
parent 2badf64b
...@@ -712,19 +712,19 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a ...@@ -712,19 +712,19 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
SYSERROR("Error doing dual-fork"); SYSERROR("Error doing dual-fork");
return false; exit(1);
} }
if (pid != 0) if (pid != 0)
exit(0); exit(0);
/* like daemon(), chdir to / and redirect 0,1,2 to /dev/null */ /* like daemon(), chdir to / and redirect 0,1,2 to /dev/null */
if (chdir("/")) { if (chdir("/")) {
SYSERROR("Error chdir()ing to /."); SYSERROR("Error chdir()ing to /.");
return false; exit(1);
} }
lxc_check_inherited(conf, true, -1); lxc_check_inherited(conf, true, -1);
if (null_stdfds() < 0) { if (null_stdfds() < 0) {
ERROR("failed to close fds"); ERROR("failed to close fds");
return false; exit(1);
} }
setsid(); setsid();
} else { } else {
...@@ -742,6 +742,8 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a ...@@ -742,6 +742,8 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
if (pid_fp == NULL) { if (pid_fp == NULL) {
SYSERROR("Failed to create pidfile '%s' for '%s'", SYSERROR("Failed to create pidfile '%s' for '%s'",
c->pidfile, c->name); c->pidfile, c->name);
if (daemonize)
exit(1);
return false; return false;
} }
...@@ -749,6 +751,8 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a ...@@ -749,6 +751,8 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
SYSERROR("Failed to write '%s'", c->pidfile); SYSERROR("Failed to write '%s'", c->pidfile);
fclose(pid_fp); fclose(pid_fp);
pid_fp = NULL; pid_fp = NULL;
if (daemonize)
exit(1);
return false; return false;
} }
......
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