mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-02-18 18:18:06 -05:00
Import ITS#3850 fix from HEAD
This commit is contained in:
parent
3e9b6bd3fb
commit
4d0632d3c8
2 changed files with 89 additions and 58 deletions
|
|
@ -1178,14 +1178,6 @@ operations_error:
|
|||
/* c_mutex is locked */
|
||||
connection_closing( conn );
|
||||
break;
|
||||
|
||||
case LDAP_REQ_BIND:
|
||||
conn->c_sasl_bind_in_progress =
|
||||
rc == LDAP_SASL_BIND_IN_PROGRESS ? 1 : 0;
|
||||
|
||||
if( conn->c_conn_state == SLAP_C_BINDING) {
|
||||
conn->c_conn_state = SLAP_C_ACTIVE;
|
||||
}
|
||||
}
|
||||
|
||||
connection_resched( conn );
|
||||
|
|
@ -1788,12 +1780,28 @@ connection_resched( Connection *conn )
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int connection_bind_cb( Operation *op, SlapReply *rs )
|
||||
{
|
||||
slap_callback *cb = op->o_callback;
|
||||
op->o_callback = cb->sc_next;
|
||||
|
||||
ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
|
||||
op->o_conn->c_conn_state = SLAP_C_ACTIVE;
|
||||
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
|
||||
|
||||
return SLAP_CB_CONTINUE;
|
||||
}
|
||||
|
||||
static int connection_op_activate( Operation *op )
|
||||
{
|
||||
int status;
|
||||
ber_tag_t tag = op->o_tag;
|
||||
|
||||
if(tag == LDAP_REQ_BIND) {
|
||||
slap_callback *sc = ch_calloc( 1, sizeof( slap_callback ));
|
||||
sc->sc_response = connection_bind_cb;
|
||||
sc->sc_next = op->o_callback;
|
||||
op->o_callback = sc;
|
||||
op->o_conn->c_conn_state = SLAP_C_BINDING;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -300,16 +300,23 @@ send_ldap_response(
|
|||
int rc = LDAP_SUCCESS;
|
||||
long bytes;
|
||||
|
||||
if (op->o_callback) {
|
||||
slap_callback *sc = op->o_callback;
|
||||
rc = SLAP_CB_CONTINUE;
|
||||
for ( ; op->o_callback; ) {
|
||||
if ( op->o_callback->sc_response ) {
|
||||
rc = op->o_callback->sc_response( op, rs );
|
||||
if ( rc != SLAP_CB_CONTINUE ) break;
|
||||
}
|
||||
op->o_callback = op->o_callback->sc_next;
|
||||
}
|
||||
if ( op->o_callback ) {
|
||||
slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
|
||||
*sc_next;
|
||||
|
||||
rc = SLAP_CB_CONTINUE;
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_response ) {
|
||||
rc = op->o_callback->sc_response( op, rs );
|
||||
if ( op->o_callback != *sc_prev ) {
|
||||
*sc_prev = op->o_callback;
|
||||
}
|
||||
if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
|
||||
}
|
||||
sc_prev = &op->o_callback->sc_next;
|
||||
}
|
||||
|
||||
op->o_callback = sc;
|
||||
if ( rc != SLAP_CB_CONTINUE ) goto clean2;
|
||||
}
|
||||
|
|
@ -479,18 +486,19 @@ cleanup:
|
|||
|
||||
clean2:;
|
||||
if ( op->o_callback ) {
|
||||
int first = 1;
|
||||
slap_callback *sc = op->o_callback, *sc_next;
|
||||
slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
|
||||
*sc_next;
|
||||
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_cleanup ) {
|
||||
(void)op->o_callback->sc_cleanup( op, rs );
|
||||
if ( first && op->o_callback != sc ) {
|
||||
sc = op->o_callback;
|
||||
if ( op->o_callback != *sc_prev ) {
|
||||
*sc_prev = op->o_callback;
|
||||
}
|
||||
if ( !op->o_callback ) break;
|
||||
}
|
||||
first = 0;
|
||||
sc_prev = &op->o_callback->sc_next;
|
||||
}
|
||||
op->o_callback = sc;
|
||||
}
|
||||
|
|
@ -756,15 +764,21 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
|
|||
|
||||
rs->sr_type = REP_SEARCH;
|
||||
if (op->o_callback) {
|
||||
slap_callback *sc = op->o_callback;
|
||||
slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
|
||||
*sc_next;
|
||||
rc = SLAP_CB_CONTINUE;
|
||||
for ( ; op->o_callback; ) {
|
||||
if ( op->o_callback->sc_response ) {
|
||||
rc = op->o_callback->sc_response( op, rs );
|
||||
if ( rc != SLAP_CB_CONTINUE ) break;
|
||||
}
|
||||
op->o_callback = op->o_callback->sc_next;
|
||||
}
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_response ) {
|
||||
rc = op->o_callback->sc_response( op, rs );
|
||||
if ( op->o_callback != *sc_prev ) {
|
||||
*sc_prev = op->o_callback;
|
||||
}
|
||||
if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
|
||||
}
|
||||
sc_prev = &op->o_callback->sc_next;
|
||||
}
|
||||
|
||||
op->o_callback = sc;
|
||||
if ( rc != SLAP_CB_CONTINUE ) goto error_return;
|
||||
}
|
||||
|
|
@ -1348,18 +1362,19 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
|
|||
|
||||
error_return:;
|
||||
if ( op->o_callback ) {
|
||||
int first = 1;
|
||||
slap_callback *sc = op->o_callback, *sc_next;
|
||||
slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
|
||||
*sc_next;
|
||||
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_cleanup ) {
|
||||
(void)op->o_callback->sc_cleanup( op, rs );
|
||||
if ( first && op->o_callback != sc ) {
|
||||
sc = op->o_callback;
|
||||
if ( op->o_callback != *sc_prev ) {
|
||||
*sc_prev = op->o_callback;
|
||||
}
|
||||
if ( !op->o_callback ) break;
|
||||
}
|
||||
first = 0;
|
||||
sc_prev = &op->o_callback->sc_next;
|
||||
}
|
||||
op->o_callback = sc;
|
||||
}
|
||||
|
|
@ -1398,16 +1413,23 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
|
|||
AttributeDescription *ad_entry = slap_schema.si_ad_entry;
|
||||
|
||||
rs->sr_type = REP_SEARCHREF;
|
||||
if (op->o_callback) {
|
||||
slap_callback *sc = op->o_callback;
|
||||
rc = SLAP_CB_CONTINUE;
|
||||
for ( ; op->o_callback; ) {
|
||||
if ( op->o_callback->sc_response ) {
|
||||
rc = op->o_callback->sc_response( op, rs );
|
||||
if ( rc != SLAP_CB_CONTINUE ) break;
|
||||
}
|
||||
op->o_callback = op->o_callback->sc_next;
|
||||
}
|
||||
if ( op->o_callback ) {
|
||||
slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
|
||||
*sc_next;
|
||||
|
||||
rc = SLAP_CB_CONTINUE;
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_response ) {
|
||||
rc = op->o_callback->sc_response( op, rs );
|
||||
if ( op->o_callback != *sc_prev ) {
|
||||
*sc_prev = op->o_callback;
|
||||
}
|
||||
if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
|
||||
}
|
||||
sc_prev = &op->o_callback->sc_next;
|
||||
}
|
||||
|
||||
op->o_callback = sc;
|
||||
if ( rc != SLAP_CB_CONTINUE ) goto rel;
|
||||
}
|
||||
|
|
@ -1564,18 +1586,19 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
|
|||
|
||||
rel:
|
||||
if ( op->o_callback ) {
|
||||
int first = 1;
|
||||
slap_callback *sc = op->o_callback, *sc_next;
|
||||
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next ) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_cleanup ) {
|
||||
(void)op->o_callback->sc_cleanup( op, rs );
|
||||
if ( first && op->o_callback != sc ) {
|
||||
sc = op->o_callback;
|
||||
}
|
||||
}
|
||||
first = 0;
|
||||
slap_callback *sc = op->o_callback, **sc_prev = &op->o_callback,
|
||||
*sc_next;
|
||||
|
||||
for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
|
||||
sc_next = op->o_callback->sc_next;
|
||||
if ( op->o_callback->sc_cleanup ) {
|
||||
(void)op->o_callback->sc_cleanup( op, rs );
|
||||
if ( op->o_callback != *sc_prev ) {
|
||||
*sc_prev = op->o_callback;
|
||||
}
|
||||
if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
|
||||
}
|
||||
sc_prev = &op->o_callback->sc_next;
|
||||
}
|
||||
op->o_callback = sc;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue