Package: sysvinit
Version: 2.85-1
Is there a race condition in init? While looking at the sysvinit
patches used by SuSe, I came across a patch to fix a race condition.
The code still applies, with a huge offset. This is the patch from
suse:
--- src/init.c
+++ src/init.c Fri Mar 12 12:47:22 2004
@@ -26,6 +26,11 @@
* did_boot made global and added to state - thanks, Miquel.
* Yet another file descriptors leak - close state pipe if
* re_exec fails.
+ * 4 Sep 2001, Andrea Arcangeli:
+ * Fix a race in spawn() that is used to deadlock init in a
+ * waitpid() loop: must set the childhandler as default before
forking
+ * off the child or the chld_handler could run before the waitpid
loop
+ * has a chance to find its zombie-child.
*/
#include <sys/types.h>
@@ -895,6 +900,7 @@
dup(f);
dup(f);
}
+ SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
if ((pid = fork()) < 0) {
log(L_VB, "cannot fork");
exit(1);
@@ -907,7 +913,6 @@
SETSIG(sa, SIGINT, SIG_IGN, SA_RESTART);
SETSIG(sa, SIGTSTP, SIG_IGN, SA_RESTART);
SETSIG(sa, SIGQUIT, SIG_IGN, SA_RESTART);
- SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
while ((rc = waitpid(pid, &st, 0)) != pid)
if (rc < 0 && errno == ECHILD)
And this is the patch relative to the current version in debian:
Index: src/init.c
===================================================================
--- src/init.c (revisjon 56)
+++ src/init.c (arbeidskopi)
@@ -966,6 +966,7 @@
dup(f);
dup(f);
}
+ SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
if ((pid = fork()) < 0) {
initlog(L_VB, "cannot fork");
exit(1);
@@ -978,7 +979,6 @@
SETSIG(sa, SIGINT, SIG_IGN, SA_RESTART);
SETSIG(sa, SIGTSTP, SIG_IGN, SA_RESTART);
SETSIG(sa, SIGQUIT, SIG_IGN, SA_RESTART);
- SETSIG(sa, SIGCHLD, SIG_DFL, SA_RESTART);
while ((rc = waitpid(pid, &st, 0)) != pid)
if (rc < 0 && errno == ECHILD)
My understanding of fork() tell me that this is a valid patch. Am I
misunderstanding something?
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]