Fix bug #5464. Pointed out by Herb @ Connectathon. In fork_domain_child() we call :
authorJeremy Allison <jra@samba.org>
Wed, 14 May 2008 21:10:39 +0000 (14:10 -0700)
committerJeremy Allison <jra@samba.org>
Wed, 14 May 2008 21:10:39 +0000 (14:10 -0700)
CatchChild();

*before* we fork the domain child. This call establishes a signal handler that
eats SIGCLD signals and doesn't call sys_select_signal() as the main daemon
SIGCLD handler should do. This causes the parent to ignore dead children and
time out, instead of calling winbind_child_died() on receipt of the signal. The
correct fix is to move the CatchChild call into the child code after the fork.

Jeremy.
(This used to be commit 8d701a142be2b75dc30ad215bc178af902eb4af9)

source3/winbindd/winbindd_dual.c

index 1d741be79ea00d497caf6f4735957150ceb65b79..d46580155c0bd271eee558d79abcfad469b0f972 100644 (file)
@@ -982,9 +982,6 @@ static bool fork_domain_child(struct winbindd_child *child)
        ZERO_STRUCT(state);
        state.pid = sys_getpid();
 
-       /* Stop zombies */
-       CatchChild();
-
        child->pid = sys_fork();
 
        if (child->pid == -1) {
@@ -1006,6 +1003,9 @@ static bool fork_domain_child(struct winbindd_child *child)
 
        /* Child */
 
+       /* Stop zombies in children */
+       CatchChild();
+
        state.sock = fdpair[0];
        close(fdpair[1]);