From e6ba16f830bf2524b39e3e1b7c8157808921f95d Mon Sep 17 00:00:00 2001 From: Glenn L McGrath 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 --- 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