From: Dwight Engen Date: Mon, 8 Apr 2013 16:45:23 +0000 (-0400) Subject: fix wait status in pid reuse case X-Git-Tag: lxc-1.0.0.alpha1~1^2~321 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe19f236a2295da1e01ab05ff59853c5a4556811;p=thirdparty%2Flxc.git fix wait status in pid reuse case Commit 37c3dfc9 sets the wait status on only the child pid. It intended to match the pid only once to protect against pid reuse but it won't because the indicator was reset to 0 every time at the top of the loop. If the child pid is reused, the wait status will be set again. Fix by setting indicator outside the loop. Signed-off-by: Dwight Engen Signed-off-by: Serge Hallyn --- diff --git a/src/lxc/lxc_init.c b/src/lxc/lxc_init.c index 5693da58f..c83c2f18b 100644 --- a/src/lxc/lxc_init.c +++ b/src/lxc/lxc_init.c @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) int err = -1; char **aargv; sigset_t mask, omask; - int i, shutdown = 0; + int i, have_status = 0, shutdown = 0; while (1) { int ret = getopt_long_only(argc, argv, "", options, NULL); @@ -162,7 +162,6 @@ int main(int argc, char *argv[]) err = 0; for (;;) { int status; - int orphan = 0; pid_t waited_pid; switch (was_interrupted) { @@ -209,10 +208,10 @@ int main(int argc, char *argv[]) * (not wrapped pid) and continue to wait for * the end of the orphan group. */ - if ((waited_pid != pid) || (orphan ==1)) - continue; - orphan = 1; - err = lxc_error_set_and_log(waited_pid, status); + if (waited_pid == pid && !have_status) { + err = lxc_error_set_and_log(waited_pid, status); + have_status = 1; + } } out: return err;