X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconnection.c;h=4662f98cebd5be4c03af22fdc0985f9fe527081a;hb=dbaf7c5c2503b2770c9075e30a9a63b6ff577d6f;hp=5311091545826819ddcb87ca47500d5a93340344;hpb=57c329a3af4843a3b02c9b19ed194c3a2825593b;p=openldap diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 5311091545..4662f98ceb 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -831,8 +831,12 @@ void connection_closing( Connection *c, const char *why ) /* wake write blocked operations */ if ( c->c_writewaiter ) { ldap_pvt_thread_cond_signal( &c->c_write_cv ); - ldap_pvt_thread_mutex_unlock( &c->c_mutex ); + /* ITS#4667 this may allow another thread to drop into + * connection_resched / connection_close before we + * finish, but that's OK. + */ slapd_clr_write( sd, 1 ); + ldap_pvt_thread_mutex_unlock( &c->c_mutex ); ldap_pvt_thread_mutex_lock( &c->c_write_mutex ); ldap_pvt_thread_mutex_lock( &c->c_mutex ); ldap_pvt_thread_mutex_unlock( &c->c_write_mutex ); @@ -853,6 +857,11 @@ connection_close( Connection *c ) assert( connections != NULL ); assert( c != NULL ); + + /* ITS#4667 we may have gotten here twice */ + if ( c->c_conn_state == SLAP_C_INVALID ) + return; + assert( c->c_struct_state == SLAP_C_USED ); assert( c->c_conn_state == SLAP_C_CLOSING );