From: Howard Chu Date: Sun, 30 Oct 2005 10:11:30 +0000 (+0000) Subject: Import ITS#3850 fix from HEAD X-Git-Tag: OPENLDAP_REL_ENG_2_2_30~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d0632d3c8f94cdcc21460fc800149076708afbb;p=thirdparty%2Fopenldap.git Import ITS#3850 fix from HEAD --- diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 82bac14dd0..b6218acb6f 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -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; } diff --git a/servers/slapd/result.c b/servers/slapd/result.c index 6cfa575586..d0b310df6d 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -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; }