diff --git a/servers/lloadd/bind.c b/servers/lloadd/bind.c index 6a2de443c1..b60b74663f 100644 --- a/servers/lloadd/bind.c +++ b/servers/lloadd/bind.c @@ -100,6 +100,7 @@ request_bind( Operation *op ) avl_dup_error ) ) { assert(0); } + upstream->c_state = SLAP_C_ACTIVE; CONNECTION_UNLOCK(upstream); ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex ); diff --git a/servers/lloadd/upstream.c b/servers/lloadd/upstream.c index 7557ca48de..7cbbeb7ec3 100644 --- a/servers/lloadd/upstream.c +++ b/servers/lloadd/upstream.c @@ -86,7 +86,7 @@ forward_final_response( Operation *op, BerElement *ber ) static int handle_bind_response( Operation *op, BerElement *ber ) { - Connection *c = op->o_client; + Connection *client = op->o_client, *upstream = op->o_upstream; BerValue response; BerElement *copy; ber_int_t result; @@ -116,28 +116,35 @@ handle_bind_response( Operation *op, BerElement *ber ) "result=%d\n", op->o_client_connid, result ); - CONNECTION_LOCK(c); + CONNECTION_LOCK(upstream); + if ( result != LDAP_SASL_BIND_IN_PROGRESS ) { + upstream->c_state = SLAP_C_READY; + } + CONNECTION_UNLOCK(upstream); + + CONNECTION_LOCK(client); switch ( result ) { case LDAP_SASL_BIND_IN_PROGRESS: break; case LDAP_SUCCESS: default: { - c->c_state = SLAP_C_READY; - c->c_type = SLAP_C_OPEN; + client->c_state = SLAP_C_READY; + client->c_type = SLAP_C_OPEN; if ( result != LDAP_SUCCESS ) { - ber_memfree( c->c_auth.bv_val ); - BER_BVZERO( &c->c_auth ); - } else if ( !ber_bvstrcasecmp( &c->c_auth, &lloadd_identity ) ) { - c->c_type = SLAP_C_PRIVILEGED; + ber_memfree( client->c_auth.bv_val ); + BER_BVZERO( &client->c_auth ); + } else if ( !ber_bvstrcasecmp( + &client->c_auth, &lloadd_identity ) ) { + client->c_type = SLAP_C_PRIVILEGED; } - if ( !BER_BVISNULL( &c->c_sasl_bind_mech ) ) { - ber_memfree( c->c_sasl_bind_mech.bv_val ); - BER_BVZERO( &c->c_sasl_bind_mech ); + if ( !BER_BVISNULL( &client->c_sasl_bind_mech ) ) { + ber_memfree( client->c_sasl_bind_mech.bv_val ); + BER_BVZERO( &client->c_sasl_bind_mech ); } break; } } - CONNECTION_UNLOCK(c); + CONNECTION_UNLOCK(client); done: if ( rc ) {