]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc.init: correctly exit with the app's error code
authorTycho Andersen <tycho@tycho.ws>
Fri, 19 Jan 2018 03:21:10 +0000 (03:21 +0000)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 19 Jan 2018 14:19:48 +0000 (15:19 +0100)
Based on the comments in the code (and the have_status flag), the intent
here (and IMO, the desired behavior) should be for init.lxc to propagate
the actual exit code from the real application process up through.
Otherwise, it is swallowed and nobody can access it.

The bug being fixed here is that ret held the correct exit code, but when
it went around the loop again (to wait for other children) ret is
clobbered. Let's save the desired exit status somewhere else, so it can't
get clobbered, and we propagate things correctly.

Signed-off-by: Tycho Andersen <tycho@tycho.ws>
src/lxc/lxc_init.c

index 60667036ac5adf2270d106a19754435dc852a461..c71c4d47161937a02d6e6ee392caddf59830828d 100644 (file)
@@ -199,7 +199,7 @@ int main(int argc, char *argv[])
        struct sigaction act;
        struct lxc_log log;
        sigset_t mask, omask;
-       int have_status = 0, shutdown = 0;
+       int have_status = 0, exit_with = 1, shutdown = 0;
 
        if (arguments_parse(&my_args, argc, argv))
                exit(EXIT_FAILURE);
@@ -412,14 +412,14 @@ int main(int argc, char *argv[])
                 * pid) and continue to wait for the end of the orphan group.
                 */
                if (waited_pid == pid && !have_status) {
-                       ret = lxc_error_set_and_log(waited_pid, status);
+                       exit_with = lxc_error_set_and_log(waited_pid, status);
                        have_status = 1;
                }
        }
 out:
        if (ret < 0)
                exit(EXIT_FAILURE);
-       exit(ret);
+       exit(exit_with);
 }
 
 static void print_usage(const struct option longopts[])