]> git.proxmox.com Git - mirror_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)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Fri, 12 Jun 2015 21:11:53 +0000 (16:11 -0500)
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 7708a8c49371fb3a2932044063493e8870a5244f..1c103e8283e755b7a81756b0a42dabb7c9aa618a 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;
                }