[lxc-devel] [PATCH] fix wait status in pid reuse case

Dwight Engen dwight.engen at oracle.com
Mon Apr 8 16:45:23 UTC 2013


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 at oracle.com>
---
 src/lxc/lxc_init.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/lxc/lxc_init.c b/src/lxc/lxc_init.c
index 5693da5..c83c2f1 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;
-- 
1.7.12.3





More information about the lxc-devel mailing list