diff --git a/CHANGES b/CHANGES index 0c6b474ec5f8ef4791a9a0aa0f89d97a63774416..961d69eab88e6b6e14061144c2b8eee6f845a27e 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,7 @@ OpenLDAP 2.4.17 Engineering Fixed slapd abandon/cancel handling for some ops (ITS#6157) Fixed slapd access setstyle to expand (ITS#6179) Fixed slapd assert with closing connections (ITS#6111) + Fixed slapd bind race condition (ITS#6189) Fixed slapd cancel behavior (ITS#6137) Fixed slapd cert validation (ITS#6098) Fixed slapd errno handling (ITS#6037) diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index cb818a4a9edb6029fe7827928de8c8433098047e..81ba89f6815feed7c2b7a7ec9216a7c4897dc135 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1127,6 +1127,9 @@ operations_error: ldap_pvt_thread_mutex_lock( &conn->c_mutex ); + if ( opidx == SLAP_OP_BIND && conn->c_conn_state == SLAP_C_BINDING ) + conn->c_conn_state = SLAP_C_ACTIVE; + cancel = op->o_cancel; if ( cancel != SLAP_CANCEL_NONE && cancel != SLAP_CANCEL_DONE ) { if ( cancel == SLAP_CANCEL_REQ ) { @@ -1534,6 +1537,8 @@ connection_input( Connection *conn , conn_readinfo *cri ) ctx = cri->ctx; op = slap_op_alloc( ber, msgid, tag, conn->c_n_ops_received++, ctx ); + Debug( LDAP_DEBUG_TRACE, "op tag %d, time %d\n", tag, op->o_time, 0); + op->o_conn = conn; /* clear state if the connection is being reused from inactive */ if ( conn->c_conn_state == SLAP_C_INACTIVE ) { @@ -1719,8 +1724,6 @@ static int connection_bind_cleanup_cb( Operation *op, SlapReply *rs ) static int connection_bind_cb( Operation *op, SlapReply *rs ) { ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex ); - if ( op->o_conn->c_conn_state == SLAP_C_BINDING ) - op->o_conn->c_conn_state = SLAP_C_ACTIVE; op->o_conn->c_sasl_bind_in_progress = ( rs->sr_err == LDAP_SASL_BIND_IN_PROGRESS );