From 26c91daddc929a2ef3f6c4eb2a3b4a779f6244da Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Wed, 3 Jun 2009 01:58:19 +0000
Subject: [PATCH] ITS#6056

---
 CHANGES                    |  1 +
 servers/slapd/connection.c | 18 ------------------
 servers/slapd/daemon.c     | 17 ++++++++---------
 servers/slapd/proto-slap.h |  1 -
 4 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/CHANGES b/CHANGES
index dd9bbfe16a..400ce62cfe 100644
--- a/CHANGES
+++ b/CHANGES
@@ -13,6 +13,7 @@ OpenLDAP 2.4.17 Engineering
 	Fixed slapd cert validation (ITS#6098)
 	Fixed slapd errno handling (ITS#6037)
 	Fixed slapd global alloc handling (ITS#6054)
+	Fixed slapd ldapi issues (ITS#6056)
 	Fixed slapd moduleload with static backends and modules (ITS#6016)
 	Fixed slapd normalization of updated schema attributes (ITS#5540)
 	Fixed slapd olcLimits handling (ITS#6159)
diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c
index 4e5ccd5fbd..bf7f68c1ce 100644
--- a/servers/slapd/connection.c
+++ b/servers/slapd/connection.c
@@ -1271,24 +1271,6 @@ int connection_read_activate( ber_socket_t s )
 	return rc;
 }
 
-void
-connection_hangup( ber_socket_t s )
-{
-	Connection *c;
-
-	c = connection_get( s );
-	if ( c ) {
-		if ( c->c_conn_state == SLAP_C_CLIENT ) {
-			connection_return( c );
-			connection_read_activate( s );
-		} else {
-			connection_closing( c, "connection lost" );
-			connection_close( c );
-			connection_return( c );
-		}
-	}
-}
-
 static int
 connection_read( ber_socket_t s, conn_readinfo *cri )
 {
diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c
index 55681f4712..2fcfcebb5e 100644
--- a/servers/slapd/daemon.c
+++ b/servers/slapd/daemon.c
@@ -2529,7 +2529,7 @@ slapd_daemon_task(
 #endif /* LDAP_DEBUG */
 
 		for ( i = 0; i < ns; i++ ) {
-			int rc = 1, fd, w = 0;
+			int rc = 1, fd, w = 0, r = 0;
 
 			if ( SLAP_EVENT_IS_LISTENER( i ) ) {
 				rc = slap_listener_activate( SLAP_EVENT_LISTENER( i ) );
@@ -2569,24 +2569,23 @@ slapd_daemon_task(
 					}
 				}
 				/* If event is a read */
-				if ( SLAP_EVENT_IS_READ( i ) ) {
+				if ( SLAP_EVENT_IS_READ( i ))
+					r = 1;
+				if ( r || !w ) {
 					Debug( LDAP_DEBUG_CONNS,
 						"daemon: read active on %d\n",
 						fd, 0, 0 );
 
-					SLAP_EVENT_CLR_READ( i );
-					connection_read_activate( fd );
-				} else if ( !w ) {
-					Debug( LDAP_DEBUG_CONNS,
-						"daemon: hangup on %d\n", fd, 0, 0 );
-					if ( SLAP_SOCK_IS_ACTIVE( fd )) {
+					if ( r ) {
+						SLAP_EVENT_CLR_READ( i );
+					} else {
 #ifdef HAVE_EPOLL
 						/* Don't keep reporting the hangup
 						 */
 						SLAP_EPOLL_SOCK_SET( fd, EPOLLET );
 #endif
-						connection_hangup( fd );
 					}
+					connection_read_activate( fd );
 				}
 			}
 		}
diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h
index e8b73c71b5..5d77594cfa 100644
--- a/servers/slapd/proto-slap.h
+++ b/servers/slapd/proto-slap.h
@@ -758,7 +758,6 @@ LDAP_SLAPD_F (Connection *) connection_init LDAP_P((
 
 LDAP_SLAPD_F (void) connection_closing LDAP_P((
 	Connection *c, const char *why ));
-LDAP_SLAPD_F (void) connection_hangup LDAP_P(( ber_socket_t fd ));
 LDAP_SLAPD_F (int) connection_valid LDAP_P(( Connection *c ));
 LDAP_SLAPD_F (const char *) connection_state2str LDAP_P(( int state ))
 	LDAP_GCCATTR((const));
-- 
GitLab