From df54b1a2443f5ec55030c3cf55221a7d4a04d38d Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 21 Dec 2006 06:06:32 +0000 Subject: [PATCH] In connections_shutdown - check for Uninitialized struct first, since attempting to lock an unint'd mutex may crash on some platforms. And there is no chance for an unint'd conn to get init'd while shutdown is occurring, so the unprotected check of struct state is safe. --- servers/slapd/connection.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 4534075be1..c64ef4866e 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -196,20 +196,22 @@ int connections_shutdown(void) ber_socket_t i; for ( i = 0; i < dtblsize; i++ ) { - ldap_pvt_thread_mutex_lock( &connections[i].c_mutex ); - if( connections[i].c_struct_state == SLAP_C_USED ) { + if( connections[i].c_struct_state != SLAP_C_UNINITIALIZED ) { + ldap_pvt_thread_mutex_lock( &connections[i].c_mutex ); + if( connections[i].c_struct_state == SLAP_C_USED ) { - /* give persistent clients a chance to cleanup */ - if( connections[i].c_conn_state == SLAP_C_CLIENT ) { - ldap_pvt_thread_pool_submit( &connection_pool, - connections[i].c_clientfunc, connections[i].c_clientarg ); - } else { - /* c_mutex is locked */ - connection_closing( &connections[i], "slapd shutdown" ); - connection_close( &connections[i] ); + /* give persistent clients a chance to cleanup */ + if( connections[i].c_conn_state == SLAP_C_CLIENT ) { + ldap_pvt_thread_pool_submit( &connection_pool, + connections[i].c_clientfunc, connections[i].c_clientarg ); + } else { + /* c_mutex is locked */ + connection_closing( &connections[i], "slapd shutdown" ); + connection_close( &connections[i] ); + } } + ldap_pvt_thread_mutex_unlock( &connections[i].c_mutex ); } - ldap_pvt_thread_mutex_unlock( &connections[i].c_mutex ); } return 0;