From aaa01deb98105d78c4ecd3bc194914b454f40a67 Mon Sep 17 00:00:00 2001 From: bug1 Date: Fri, 26 Sep 2003 10:45:55 +0000 Subject: Patch by Guillaume Morin Fix two race conditions, as described at. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=212764 git-svn-id: svn://busybox.net/trunk/busybox@7567 69ca8d6d-28ef-0310-b511-8ec308f3f277 --- init/init.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/init/init.c b/init/init.c index 85792c9b7..d332ccdbe 100644 --- a/init/init.c +++ b/init/init.c @@ -500,7 +500,12 @@ static pid_t run(const struct init_action *a) signal(SIGCHLD, SIG_DFL); /* Wait for child to exit */ - while ((tmp_pid = waitpid(pid, &junk, 0)) != pid); + while ((tmp_pid = waitpid(pid, &junk, 0)) != pid) { + if (tmp_pid == -1 && errno == ECHILD) { + break; + } + /* FIXME handle other errors */ + } /* See if stealing the controlling tty back is necessary */ pgrp = tcgetpgrp(0); @@ -624,12 +629,15 @@ static int waitfor(const struct init_action *a) pid = run(a); while (1) { - wpid = wait(&status); - if (wpid > 0 && wpid != pid) { - continue; - } + wpid = waitpid(pid,&status,0); if (wpid == pid) break; + if (wpid == -1 && errno == ECHILD) { + /* we missed its termination */ + break; + } + /* FIXME other errors should maybe trigger an error, but allow + * the program to continue */ } return wpid; } -- cgit v1.2.3-55-g6feb