aboutsummaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorbug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-09-26 10:45:55 +0000
committerbug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-09-26 10:45:55 +0000
commitaaa01deb98105d78c4ecd3bc194914b454f40a67 (patch)
treee124c339f514c556442e4bce82a6fd62c768e33a /init
parent38bc00cd979a3c702254ce4290ea4751f46a15f9 (diff)
downloadbusybox-w32-aaa01deb98105d78c4ecd3bc194914b454f40a67.tar.gz
busybox-w32-aaa01deb98105d78c4ecd3bc194914b454f40a67.tar.bz2
busybox-w32-aaa01deb98105d78c4ecd3bc194914b454f40a67.zip
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
Diffstat (limited to 'init')
-rw-r--r--init/init.c18
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)
500 signal(SIGCHLD, SIG_DFL); 500 signal(SIGCHLD, SIG_DFL);
501 501
502 /* Wait for child to exit */ 502 /* Wait for child to exit */
503 while ((tmp_pid = waitpid(pid, &junk, 0)) != pid); 503 while ((tmp_pid = waitpid(pid, &junk, 0)) != pid) {
504 if (tmp_pid == -1 && errno == ECHILD) {
505 break;
506 }
507 /* FIXME handle other errors */
508 }
504 509
505 /* See if stealing the controlling tty back is necessary */ 510 /* See if stealing the controlling tty back is necessary */
506 pgrp = tcgetpgrp(0); 511 pgrp = tcgetpgrp(0);
@@ -624,12 +629,15 @@ static int waitfor(const struct init_action *a)
624 629
625 pid = run(a); 630 pid = run(a);
626 while (1) { 631 while (1) {
627 wpid = wait(&status); 632 wpid = waitpid(pid,&status,0);
628 if (wpid > 0 && wpid != pid) {
629 continue;
630 }
631 if (wpid == pid) 633 if (wpid == pid)
632 break; 634 break;
635 if (wpid == -1 && errno == ECHILD) {
636 /* we missed its termination */
637 break;
638 }
639 /* FIXME other errors should maybe trigger an error, but allow
640 * the program to continue */
633 } 641 }
634 return wpid; 642 return wpid;
635} 643}