[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Sep 30 15:09:03 MDT 2014


The branch, master has been updated
       via  703ef59 tdb: Fix a comment
       via  93e81d423 s3: lib: Signal handling - ensure smbrun and change password code save and restore existing SIGCHLD handlers.
       via  fc8e105 lib: util [ctdb]: Signal handling - change CatchChild() and CatchChildLeaveStatus() to return the previous handler.
       via  16e460e s3: nmbd: Ensure the main nmbd process doesn't create zombies.
      from  ba33426 s3:torture: transfer 1M message with fds in LOCAL-MESSAGING-FDPASS2 test

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


- Log -----------------------------------------------------------------
commit 703ef59d00a536794938d2eebbcdf4aaa043f4ca
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Sep 29 09:22:09 2014 +0000

    tdb: Fix a comment
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Sep 30 23:08:07 CEST 2014 on sn-devel-104

commit 93e81d423d790ce7ccfe0bd13286dbf49a637db2
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Sep 23 14:51:18 2014 -0700

    s3: lib: Signal handling - ensure smbrun and change password code save and restore existing SIGCHLD handlers.
    
    Bug #10831 - SIGCLD Signal handler not correctly reinstalled on old library code use - smbrun etc.
    
    https://bugzilla.samba.org/show_bug.cgi?id=10831
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit fc8e1056fee9779a8bc40e7398b49bfbaa94ccd7
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Sep 23 14:48:35 2014 -0700

    lib: util [ctdb]: Signal handling - change CatchChild() and CatchChildLeaveStatus() to return the previous handler.
    
    Bug #10831 - SIGCLD Signal handler not correctly reinstalled on old library code use - smbrun etc.
    
    https://bugzilla.samba.org/show_bug.cgi?id=10831
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 16e460e180cf8d6708b27137742fbce80e29b823
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Sep 23 13:32:37 2014 -0700

    s3: nmbd: Ensure the main nmbd process doesn't create zombies.
    
    Use the same mechanism as setup for smbd and winbindd.
    
    Fixes bug #10830 - nmbd can leave unreaped zombies.
    
    https://bugzilla.samba.org/show_bug.cgi?id=10830
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

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

Summary of changes:
 ctdb/lib/util/signal.c                       |    8 ++++----
 ctdb/lib/util/util.h                         |    4 ++--
 lib/tdb/common/tdb.c                         |    2 +-
 lib/util/samba_util.h                        |    4 ++--
 lib/util/signal.c                            |    8 ++++----
 source3/lib/smbrun.c                         |   18 ++++++++++--------
 source3/nmbd/nmbd.c                          |    3 +++
 source3/rpc_server/samr/srv_samr_chgpasswd.c |    9 +++++----
 8 files changed, 31 insertions(+), 25 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/lib/util/signal.c b/ctdb/lib/util/signal.c
index ead947e..33a9900 100644
--- a/ctdb/lib/util/signal.c
+++ b/ctdb/lib/util/signal.c
@@ -129,16 +129,16 @@ void (*CatchSignal(int signum,void (*handler)(int )))(int)
  Ignore SIGCLD via whatever means is necessary for this OS.
 **/
 
-void CatchChild(void)
+void (*CatchChild(void))(int)
 {
-	CatchSignal(SIGCLD, sig_cld);
+	return CatchSignal(SIGCLD, sig_cld);
 }
 
 /**
  Catch SIGCLD but leave the child around so it's status can be reaped.
 **/
 
-void CatchChildLeaveStatus(void)
+void (*CatchChildLeaveStatus(void))(int)
 {
-	CatchSignal(SIGCLD, sig_cld_leave_status);
+	return CatchSignal(SIGCLD, sig_cld_leave_status);
 }
diff --git a/ctdb/lib/util/util.h b/ctdb/lib/util/util.h
index c7734d1..87aaa45 100644
--- a/ctdb/lib/util/util.h
+++ b/ctdb/lib/util/util.h
@@ -100,12 +100,12 @@ void (*CatchSignal(int signum,void (*handler)(int )))(int);
 /**
  Ignore SIGCLD via whatever means is necessary for this OS.
 **/
-void CatchChild(void);
+void (*CatchChild(void))(int);
 
 /**
  Catch SIGCLD but leave the child around so it's status can be reaped.
 **/
-void CatchChildLeaveStatus(void);
+void (*CatchChildLeaveStatus(void))(int);
 
 
 /* The following definitions come from lib/util/util_str.c  */
diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c
index ae98c96..9885d8c 100644
--- a/lib/tdb/common/tdb.c
+++ b/lib/tdb/common/tdb.c
@@ -511,7 +511,7 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
 			goto fail;
 		}
 	}
-	/* reset the error code potentially set by the tdb_update() */
+	/* reset the error code potentially set by the tdb_update_hash() */
 	tdb->ecode = TDB_SUCCESS;
 
 	/* delete any existing record - if it doesn't exist we don't
diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h
index 9da61fa..e9de6fa 100644
--- a/lib/util/samba_util.h
+++ b/lib/util/samba_util.h
@@ -108,12 +108,12 @@ void (*CatchSignal(int signum,void (*handler)(int )))(int);
 /**
  Ignore SIGCLD via whatever means is necessary for this OS.
 **/
-void CatchChild(void);
+void (*CatchChild(void))(int);
 
 /**
  Catch SIGCLD but leave the child around so it's status can be reaped.
 **/
-void CatchChildLeaveStatus(void);
+void (*CatchChildLeaveStatus(void))(int);
 
 struct sockaddr;
 
diff --git a/lib/util/signal.c b/lib/util/signal.c
index ead947e..33a9900 100644
--- a/lib/util/signal.c
+++ b/lib/util/signal.c
@@ -129,16 +129,16 @@ void (*CatchSignal(int signum,void (*handler)(int )))(int)
  Ignore SIGCLD via whatever means is necessary for this OS.
 **/
 
-void CatchChild(void)
+void (*CatchChild(void))(int)
 {
-	CatchSignal(SIGCLD, sig_cld);
+	return CatchSignal(SIGCLD, sig_cld);
 }
 
 /**
  Catch SIGCLD but leave the child around so it's status can be reaped.
 **/
 
-void CatchChildLeaveStatus(void)
+void (*CatchChildLeaveStatus(void))(int)
 {
-	CatchSignal(SIGCLD, sig_cld_leave_status);
+	return CatchSignal(SIGCLD, sig_cld_leave_status);
 }
diff --git a/source3/lib/smbrun.c b/source3/lib/smbrun.c
index 15a0c88..55f7a87 100644
--- a/source3/lib/smbrun.c
+++ b/source3/lib/smbrun.c
@@ -73,6 +73,7 @@ static int smbrun_internal(const char *cmd, int *outfd, bool sanitize)
 	pid_t pid;
 	uid_t uid = current_user.ut.uid;
 	gid_t gid = current_user.ut.gid;
+	void (*saved_handler)(int);
 
 	/*
 	 * Lose any elevated privileges.
@@ -94,11 +95,11 @@ static int smbrun_internal(const char *cmd, int *outfd, bool sanitize)
 	 * SIGCLD signals as it also eats the exit status code. JRA.
 	 */
 
-	CatchChildLeaveStatus();
+	saved_handler = CatchChildLeaveStatus();
                                    	
 	if ((pid=fork()) < 0) {
 		DEBUG(0,("smbrun: fork failed with error %s\n", strerror(errno) ));
-		CatchChild(); 
+		(void)CatchSignal(SIGCLD, saved_handler);
 		if (outfd) {
 			close(*outfd);
 			*outfd = -1;
@@ -123,7 +124,7 @@ static int smbrun_internal(const char *cmd, int *outfd, bool sanitize)
 			break;
 		}
 
-		CatchChild(); 
+		(void)CatchSignal(SIGCLD, saved_handler);
 
 		if (wpid != pid) {
 			DEBUG(2,("waitpid(%d) : %s\n",(int)pid,strerror(errno)));
@@ -148,7 +149,7 @@ static int smbrun_internal(const char *cmd, int *outfd, bool sanitize)
 		return status;
 	}
 	
-	CatchChild(); 
+	(void)CatchChild();
 	
 	/* we are in the child. we exec /bin/sh to do the work for us. we
 	   don't directly exec the command we want because it may be a
@@ -237,6 +238,7 @@ int smbrunsecret(const char *cmd, const char *secret)
 	uid_t uid = current_user.ut.uid;
 	gid_t gid = current_user.ut.gid;
 	int ifd[2];
+	void (*saved_handler)(int);
 	
 	/*
 	 * Lose any elevated privileges.
@@ -257,11 +259,11 @@ int smbrunsecret(const char *cmd, const char *secret)
 	 * SIGCLD signals as it also eats the exit status code. JRA.
 	 */
 
-	CatchChildLeaveStatus();
+	saved_handler = CatchChildLeaveStatus();
                                    	
 	if ((pid=fork()) < 0) {
 		DEBUG(0, ("smbrunsecret: fork failed with error %s\n", strerror(errno)));
-		CatchChild(); 
+		(void)CatchSignal(SIGCLD, saved_handler);
 		return errno;
     	}
 
@@ -293,7 +295,7 @@ int smbrunsecret(const char *cmd, const char *secret)
 			break;
 		}
 
-		CatchChild(); 
+		(void)CatchSignal(SIGCLD, saved_handler);
 
 		if (wpid != pid) {
 			DEBUG(2, ("waitpid(%d) : %s\n", (int)pid, strerror(errno)));
@@ -309,7 +311,7 @@ int smbrunsecret(const char *cmd, const char *secret)
 		return status;
 	}
 	
-	CatchChild(); 
+	(void)CatchChild();
 	
 	/* we are in the child. we exec /bin/sh to do the work for us. we
 	   don't directly exec the command we want because it may be a
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index 50b18e5..d883c0a 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/nmbd/nmbd.c
@@ -884,6 +884,9 @@ static bool open_sockets(bool isdaemon, int port)
 	BlockSignals(True, SIGUSR2);
 #endif
 
+	/* Ignore children - no zombies. */
+	CatchChild();
+
 	if ( opt_interactive ) {
 		Fork = False;
 		log_stdout = True;
diff --git a/source3/rpc_server/samr/srv_samr_chgpasswd.c b/source3/rpc_server/samr/srv_samr_chgpasswd.c
index 1c9c33a..684ccee 100644
--- a/source3/rpc_server/samr/srv_samr_chgpasswd.c
+++ b/source3/rpc_server/samr/srv_samr_chgpasswd.c
@@ -391,6 +391,7 @@ static bool chat_with_program(char *passwordprogram, const struct passwd *pass,
 	pid_t pid, wpid;
 	int wstat;
 	bool chstat = False;
+	void (*saved_handler)(int);
 
 	if (pass == NULL) {
 		DEBUG(0, ("chat_with_program: user doesn't exist in the UNIX password database.\n"));
@@ -408,13 +409,13 @@ static bool chat_with_program(char *passwordprogram, const struct passwd *pass,
 	 * SIGCLD signals as it also eats the exit status code. JRA.
 	 */
 
-	CatchChildLeaveStatus();
+	saved_handler = CatchChildLeaveStatus();
 
 	if ((pid = fork()) < 0) {
 		DEBUG(3, ("chat_with_program: Cannot fork() child for password change: %s\n", pass->pw_name));
 		SAFE_FREE(slavedev);
 		close(master);
-		CatchChild();
+		(void)CatchSignal(SIGCLD, saved_handler);
 		return (False);
 	}
 
@@ -439,14 +440,14 @@ static bool chat_with_program(char *passwordprogram, const struct passwd *pass,
 		if (wpid < 0) {
 			DEBUG(3, ("chat_with_program: The process is no longer waiting!\n\n"));
 			close(master);
-			CatchChild();
+			(void)CatchSignal(SIGCLD, saved_handler);
 			return (False);
 		}
 
 		/*
 		 * Go back to ignoring children.
 		 */
-		CatchChild();
+		(void)CatchSignal(SIGCLD, saved_handler);
 
 		close(master);
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list