From 35e91be48246eff7801122da901eb985ea262f5b Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Sat, 12 Jun 1999 00:03:39 +0000 Subject: [PATCH] connection_get: Connection could be closed before acquiring connections_mutex. if c->c_struct_state == SLAP_C_UNUSED, return NULL. --- servers/slapd/connection.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 8204126b91..1a78ba46ba 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -156,13 +156,15 @@ static Connection* connection_get( int s ) #ifndef HAVE_WINSOCK c = &connections[s]; - assert( c->c_struct_state == SLAP_C_USED ); + assert( c->c_struct_state != SLAP_C_UNINITIALIZED ); - ldap_pvt_thread_mutex_lock( &c->c_mutex ); + if( c->c_struct_state != SLAP_C_USED ) { + /* connection must have been closed */ + assert( c->c_conn_state == SLAP_C_INVALID ); + assert( !ber_pvt_sb_in_use( c->c_sb ) ); - assert( c->c_struct_state == SLAP_C_USED ); - assert( c->c_conn_state != SLAP_C_INVALID ); - assert( ber_pvt_sb_in_use( c->c_sb ) ); + return NULL; + } #else c = NULL; @@ -188,7 +190,6 @@ static Connection* connection_get( int s ) if( ber_pvt_sb_get_desc( connections[i].c_sb ) == s ) { c = &connections[i]; - ldap_pvt_thread_mutex_lock( &c->c_mutex ); break; } } @@ -196,11 +197,18 @@ static Connection* connection_get( int s ) #endif if( c != NULL ) { + ldap_pvt_thread_mutex_lock( &c->c_mutex ); + /* we do this AFTER locking to aid in debugging */ Debug( LDAP_DEBUG_TRACE, "connection_get(%d): got connid=%ld\n", s, c->c_connid, 0 ); + + assert( c->c_struct_state == SLAP_C_USED ); + assert( c->c_conn_state != SLAP_C_INVALID ); + assert( ber_pvt_sb_in_use( c->c_sb ) ); } + return c; } -- 2.39.5