]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
daemonized start: exit children on failure, don't return
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 11 Jun 2015 04:08:15 +0000 (23:08 -0500)
committerStéphane Graber <stgraber@ubuntu.com>
Fri, 28 Aug 2015 22:02:16 +0000 (18:02 -0400)
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 <serge.hallyn@ubuntu.com>
Acked-by: Tycho Andersen <tycho.andersen@canonical.com>
src/lxc/lxccontainer.c

index c2c8b12d7553cb85e033620b6e267bc77505b25c..ec146eed4f640477d6b59fc15c39ca17eae31650 100644 (file)
@@ -613,19 +613,19 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv
                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, -1);
                if (null_stdfds() < 0) {
                        ERROR("failed to close fds");
-                       return false;
+                       exit(1);
                }
                setsid();
        } else {
@@ -643,6 +643,8 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv
                if (pid_fp == NULL) {
                        SYSERROR("Failed to create pidfile '%s' for '%s'",
                                 c->pidfile, c->name);
+                       if (daemonize)
+                               exit(1);
                        return false;
                }
 
@@ -650,6 +652,8 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv
                        SYSERROR("Failed to write '%s'", c->pidfile);
                        fclose(pid_fp);
                        pid_fp = NULL;
+                       if (daemonize)
+                               exit(1);
                        return false;
                }