ber_socket_t sd;
unsigned long connid;
const char *close_reason;
+ Sockbuf *sb;
assert( connections != NULL );
assert( c != NULL );
c->c_currentber = NULL;
}
- ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_GET_FD, &sd );
- slapd_sd_lock();
- ber_sockbuf_free( c->c_sb );
- if ( sd != AC_SOCKET_INVALID ) {
- slapd_remove( sd, 1, 0, 1 );
- Statslog( LDAP_DEBUG_STATS, (close_reason
- ? "conn=%lu fd=%ld closed (%s)\n"
- : "conn=%lu fd=%ld closed\n"),
- connid, (long) sd, close_reason, 0, 0 );
- } else {
- slapd_sd_unlock();
+#ifdef LDAP_SLAPI
+ /* call destructors, then constructors; avoids unnecessary allocation */
+ if ( slapi_plugins_used ) {
+ slapi_int_clear_object_extensions( SLAPI_X_EXT_CONNECTION, c );
}
+#endif
- c->c_sb = ber_sockbuf_alloc( );
+ c->c_conn_state = SLAP_C_INVALID;
+ c->c_struct_state = SLAP_C_UNUSED;
+ c->c_close_reason = "?"; /* should never be needed */
+ sb = c->c_sb;
+ c->c_sb = ber_sockbuf_alloc( );
{
ber_len_t max = sockbuf_max_incoming;
ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_SET_MAX_INCOMING, &max );
}
- c->c_conn_state = SLAP_C_INVALID;
- c->c_struct_state = SLAP_C_UNUSED;
- c->c_close_reason = "?"; /* should never be needed */
+ ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd );
+ slapd_sd_lock();
-#ifdef LDAP_SLAPI
- /* call destructors, then constructors; avoids unnecessary allocation */
- if ( slapi_plugins_used ) {
- slapi_int_clear_object_extensions( SLAPI_X_EXT_CONNECTION, c );
+ ber_sockbuf_free( sb );
+
+ /* c must be fully reset by this point; when we call slapd_remove
+ * it may get immediately reused by a new connection.
+ */
+ if ( sd != AC_SOCKET_INVALID ) {
+ slapd_remove( sd, 1, 0, 1 );
+
+ Statslog( LDAP_DEBUG_STATS, (close_reason
+ ? "conn=%lu fd=%ld closed (%s)\n"
+ : "conn=%lu fd=%ld closed\n"),
+ connid, (long) sd, close_reason, 0, 0 );
+ } else {
+ slapd_sd_unlock();
}
-#endif
}
int connection_state_closing( Connection *c )
c->c_close_reason = why;
/* don't listen on this port anymore */
- slapd_clr_read( sd, 1 );
+ slapd_clr_read( sd, 0 );
/* abandon active operations */
connection_abandon( c );
slapd_clr_write( sd, 1 );
if ( c->c_writewaiter ) {
ldap_pvt_thread_cond_signal( &c->c_write_cv );
- ldap_pvt_thread_mutex_unlock( &c->c_mutex );
- ldap_pvt_thread_yield();
- ldap_pvt_thread_mutex_lock( &c->c_mutex );
}
} else if( why == NULL && c->c_close_reason == conn_lost_str ) {
Debug( LDAP_DEBUG_TRACE,
"connection_read(%d): closing, ignoring input for id=%lu\n",
s, c->c_connid, 0 );
-
-#ifdef SLAP_LIGHTWEIGHT_DISPATCHER
- slapd_set_read( s, 1 );
-#endif
connection_return( c );
return 0;
}
c->c_needs_tls_accept = 0;
/* c_mutex is locked */
connection_closing( c, "TLS negotiation failure" );
-
-#if 0
- {
- struct timeval tv;
- fd_set rfd;
- /* Drain input before close, to allow SSL error codes
- * to propagate to client. */
- FD_ZERO(&rfd);
- FD_SET(s, &rfd);
- for (rc=1; rc>0;) {
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- rc = select(s+1, &rfd, NULL, NULL, &tv);
- if (rc == 1) {
- ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_DRAIN, NULL);
- }
- }
- }
-#endif
-
connection_close( c );
connection_return( c );
return 0;
}
/* if success and data is ready, fall thru to data input loop */
- if( rc != 0 ||
- !ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_DATA_READY, NULL ) )
+ if( !ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_DATA_READY, NULL ) )
{
#ifdef SLAP_LIGHTWEIGHT_DISPATCHER
slapd_set_read( s, 1 );
#endif
if( rc < 0 ) {
- Debug( LDAP_DEBUG_TRACE,
+ Debug( LDAP_DEBUG_CONNS,
"connection_read(%d): input error=%d id=%lu, closing.\n",
s, rc, c->c_connid );
Operation *op;
if( conn->c_conn_state == SLAP_C_CLOSING ) {
- int rc;
ber_socket_t sd;
ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd );
- if( conn->c_conn_state != SLAP_C_CLOSING ) {
- Debug( LDAP_DEBUG_TRACE, "connection_resched: "
- "closed by other thread conn=%lu sd=%d\n",
- conn->c_connid, sd, 0 );
- } else {
- Debug( LDAP_DEBUG_TRACE, "connection_resched: "
- "attempting closing conn=%lu sd=%d\n",
- conn->c_connid, sd, 0 );
- connection_close( conn );
- }
-
+ Debug( LDAP_DEBUG_TRACE, "connection_resched: "
+ "attempting closing conn=%lu sd=%d\n",
+ conn->c_connid, sd, 0 );
+ connection_close( conn );
return 0;
}