]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
fix wait status in pid reuse case
authorDwight Engen <dwight.engen@oracle.com>
Mon, 8 Apr 2013 16:45:23 +0000 (12:45 -0400)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 10 Apr 2013 20:24:58 +0000 (15:24 -0500)
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 <dwight.engen@oracle.com>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/lxc_init.c

index 5693da58fe7c05aceb81f90fd84bebc6d4ee36ac..c83c2f18bd8e1f674c75def521bd5370bea35716 100644 (file)
@@ -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;