[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Thu Apr 1 09:26:12 MDT 2010


The branch, master has been updated
       via  7357720... s3:winbindd: fix problems with SIGCHLD handling (bug #7317)
      from  3475c61... s3: Ensure NULL termination before printing in winbindd_pam_logoff

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 73577205cf81644e7fe853eaf3e6459f7f443096
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Apr 1 16:23:06 2010 +0200

    s3:winbindd: fix problems with SIGCHLD handling (bug #7317)
    
    The main problem is that we call CatchChild() within the
    parent winbindd, which overwrites the signal handler
    that was registered by winbindd_setup_sig_chld_handler().
    
    That means winbindd_sig_chld_handler() and winbind_child_died()
    are never triggered when a winbindd domain child dies.
    As a result will get "broken pipe" for all requests to that domain.
    
    To reduce the risk of similar bugs in future we call
    CatchChild() in winbindd_reinit_after_fork() now.
    
    We also use a full winbindd_reinit_after_fork() in the
    cache validation child now instead instead of just resetting
    the SIGCHLD handler by hand. This will also fix possible
    tdb problems on systems without pread/pwrite and disabled mmap
    as we now correctly reopen the tdb handle for the child.
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source3/winbindd/winbindd.c      |   14 +++-----------
 source3/winbindd/winbindd_cm.c   |    3 ---
 source3/winbindd/winbindd_dual.c |    6 +++---
 3 files changed, 6 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c
index 13cadff..d1d33d3 100644
--- a/source3/winbindd/winbindd.c
+++ b/source3/winbindd/winbindd.c
@@ -407,7 +407,6 @@ static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
 	 * so we don't block the main winbindd and the validation
 	 * code can safely use fork/waitpid...
 	 */
-	CatchChild();
 	child_pid = sys_fork();
 
 	if (child_pid == -1) {
@@ -425,16 +424,9 @@ static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
 
 	/* child */
 
-	/* install default SIGCHLD handler: validation code uses fork/waitpid */
-	ZERO_STRUCT(act);
-	act.sa_handler = SIG_DFL;
-#ifdef SA_RESTART
-	/* We *want* SIGALRM to interrupt a system call. */
-	act.sa_flags = SA_RESTART;
-#endif
-	sigemptyset(&act.sa_mask);
-	sigaddset(&act.sa_mask,SIGCHLD);
-	sigaction(SIGCHLD,&act,&oldact);
+	if (!winbindd_reinit_after_fork(NULL)) {
+		_exit(0);
+	}
 
 	ret = (uint8)winbindd_validate_cache_nobackup();
 	DEBUG(10, ("winbindd_msg_validata_cache: got return value %d\n", ret));
diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c
index c2df244..c013fae 100644
--- a/source3/winbindd/winbindd_cm.c
+++ b/source3/winbindd/winbindd_cm.c
@@ -180,9 +180,6 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain)
 	pid_t parent_pid = sys_getpid();
 	char *lfile = NULL;
 
-	/* Stop zombies */
-	CatchChild();
-
 	if (domain->dc_probe_pid != (pid_t)-1) {
 		/*
 		 * We might already have a DC probe
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index ca6af1f..eb9ace2 100644
--- a/source3/winbindd/winbindd_dual.c
+++ b/source3/winbindd/winbindd_dual.c
@@ -1215,6 +1215,9 @@ bool winbindd_reinit_after_fork(const char *logfilename)
 					    logfilename))
 		return false;
 
+	/* Stop zombies in children */
+	CatchChild();
+
 	/* Don't handle the same messages as our parent. */
 	messaging_deregister(winbind_messaging_context(),
 			     MSG_SMB_CONF_UPDATED, NULL);
@@ -1338,9 +1341,6 @@ static bool fork_domain_child(struct winbindd_child *child)
 
 	DEBUG(10, ("Child process %d\n", (int)sys_getpid()));
 
-	/* Stop zombies in children */
-	CatchChild();
-
 	state.sock = fdpair[0];
 	close(fdpair[1]);
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list