]> git.sur5r.net Git - openldap/commitdiff
Import ITS#3850 fix from HEAD
authorHoward Chu <hyc@openldap.org>
Sun, 30 Oct 2005 10:11:30 +0000 (10:11 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 30 Oct 2005 10:11:30 +0000 (10:11 +0000)
servers/slapd/connection.c
servers/slapd/result.c

index 82bac14dd018c6e34a476c9fb2226c9b8bddbd8e..b6218acb6f24a7bd351bace59822b7ca6bb28c04 100644 (file)
@@ -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;
        }
 
index 6cfa575586d6a93ca834748e3c554432fd2651c7..d0b310df6dd1277703ac995ff7818f88bd740ab9 100644 (file)
@@ -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;
        }