summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath2003-09-26 10:45:55 +0000
committerGlenn L McGrath2003-09-26 10:45:55 +0000
commite6ba16f830bf2524b39e3e1b7c8157808921f95d (patch)
treee124c339f514c556442e4bce82a6fd62c768e33a
parentf7dd10f67ce892530b2a2093b149722cf4903e76 (diff)
downloadbusybox-e6ba16f830bf2524b39e3e1b7c8157808921f95d.zip
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
-rw-r--r--init/init.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/init/init.c b/init/init.c
index 85792c9..d332ccd 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;
}