From: Serge Hallyn Date: Thu, 11 Jun 2015 04:08:15 +0000 (-0500) Subject: daemonized start: exit children on failure, don't return X-Git-Tag: lxc-2.0.0.beta1~242 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13353dc420e3a7b6ff1234b0ce9fbd3a1802837c;p=thirdparty%2Flxc.git 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: Serge Hallyn Acked-by: Tycho Andersen --- diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 7708a8c49..1c103e828 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -712,19 +712,19 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a pid = fork(); if (pid < 0) { SYSERROR("Error doing dual-fork"); - return false; + exit(1); } if (pid != 0) exit(0); /* like daemon(), chdir to / and redirect 0,1,2 to /dev/null */ if (chdir("/")) { SYSERROR("Error chdir()ing to /."); - return false; + exit(1); } lxc_check_inherited(conf, true, -1); if (null_stdfds() < 0) { ERROR("failed to close fds"); - return false; + exit(1); } setsid(); } else { @@ -742,6 +742,8 @@ 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); + if (daemonize) + exit(1); return false; } @@ -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); fclose(pid_fp); pid_fp = NULL; + if (daemonize) + exit(1); return false; }