]> 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>
Wed, 1 Jul 2015 17:48:38 +0000 (13:48 -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 958c751375797409c60da3385da4cfb9dfce8ca7..c3bcf18aabca5b4c7568bb092e78f8dfaf454401 100644 (file)
@@ -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;
                }