From: Howard Chu Date: Thu, 21 Dec 2006 06:06:32 +0000 (+0000) Subject: In connections_shutdown - check for Uninitialized struct first, since X-Git-Tag: OPENLDAP_REL_ENG_2_4_4ALPHA~8^2~328 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=df54b1a2443f5ec55030c3cf55221a7d4a04d38d;p=openldap 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. --- 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 ) { - - /* 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] ); + 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] ); + } } + ldap_pvt_thread_mutex_unlock( &connections[i].c_mutex ); } - ldap_pvt_thread_mutex_unlock( &connections[i].c_mutex ); } return 0;