From b9678afd888f004798b6bdb758af0981ecffa2cb Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Wed, 29 Apr 2009 02:26:06 +0000
Subject: [PATCH] ITS#6037

---
 CHANGES                |  1 +
 servers/slapd/daemon.c |  8 ++++++++
 servers/slapd/main.c   | 10 ++++------
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/CHANGES b/CHANGES
index b8a0f98222..d23def55eb 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,7 @@ OpenLDAP 2.4 Change Log
 
 OpenLDAP 2.4.17 Engineering
 	Fixed slapd normalization of updated schema attributes (ITS#5540)
+	Fixed slapd errno handling (ITS#6037)
 	Build Environment
 		Added test056-monitor (ITS#5540)
 		Added test057-memberof-refint (ITS#5395)
diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c
index fe87e196a4..5d4cbf645a 100644
--- a/servers/slapd/daemon.c
+++ b/servers/slapd/daemon.c
@@ -2727,6 +2727,8 @@ sockdestroy( void )
 RETSIGTYPE
 slap_sig_shutdown( int sig )
 {
+	int save_errno = errno;
+
 #if 0
 	Debug(LDAP_DEBUG_TRACE, "slap_sig_shutdown: signal %d\n", sig, 0, 0);
 #endif
@@ -2755,15 +2757,21 @@ slap_sig_shutdown( int sig )
 
 	/* reinstall self */
 	(void) SIGNAL_REINSTALL( sig, slap_sig_shutdown );
+
+	errno = save_errno;
 }
 
 RETSIGTYPE
 slap_sig_wake( int sig )
 {
+	int save_errno = errno;
+
 	WAKE_LISTENER(1);
 
 	/* reinstall self */
 	(void) SIGNAL_REINSTALL( sig, slap_sig_wake );
+
+	errno = save_errno;
 }
 
 
diff --git a/servers/slapd/main.c b/servers/slapd/main.c
index fa008ee2cf..b22e8b70f1 100644
--- a/servers/slapd/main.c
+++ b/servers/slapd/main.c
@@ -1056,13 +1056,12 @@ wait4child( int sig )
     int save_errno = errno;
 
 #ifdef WNOHANG
-    errno = 0;
+    do
+        errno = 0;
 #ifdef HAVE_WAITPID
-    while ( waitpid( (pid_t)-1, NULL, WNOHANG ) > 0 || errno == EINTR )
-	;	/* NULL */
+    while ( waitpid( (pid_t)-1, NULL, WNOHANG ) > 0 || errno == EINTR );
 #else
-    while ( wait3( NULL, WNOHANG, NULL ) > 0 || errno == EINTR )
-	;	/* NULL */
+    while ( wait3( NULL, WNOHANG, NULL ) > 0 || errno == EINTR );
 #endif
 #else
     (void) wait( NULL );
@@ -1072,4 +1071,3 @@ wait4child( int sig )
 }
 
 #endif /* LDAP_SIGCHLD */
-
-- 
GitLab