From: Howard Chu Date: Sun, 28 Jun 2009 03:37:20 +0000 (+0000) Subject: ITS#6189 delay resetting the SLAP_C_BINDING state until the Bind handler X-Git-Tag: ACLCHECK_0~478 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=c62ebb9da2fdfc5c80d769b13b9a21a2af2d838c;p=openldap ITS#6189 delay resetting the SLAP_C_BINDING state until the Bind handler has fully returned to the connection manager. This may result in "deferring operation: binding" messages being logged again (ITS#3850) but it should not cause any hangs. --- diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index cb818a4a9e..81ba89f681 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 );