diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2003-09-26 10:45:55 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2003-09-26 10:45:55 +0000 |
commit | e6ba16f830bf2524b39e3e1b7c8157808921f95d (patch) | |
tree | e124c339f514c556442e4bce82a6fd62c768e33a /init | |
parent | f7dd10f67ce892530b2a2093b149722cf4903e76 (diff) | |
download | busybox-e6ba16f830bf2524b39e3e1b7c8157808921f95d.tar.gz |
Patch by Guillaume Morin
Fix two race conditions, as described at.
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=212764
Diffstat (limited to 'init')
-rw-r--r-- | init/init.c | 18 |
1 files 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; } |