]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Straighten up client pending op tracking
authorOndřej Kuzník <okuznik@symas.com>
Fri, 5 Oct 2018 13:56:19 +0000 (14:56 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:58:15 +0000 (17:58 +0000)
servers/lloadd/bind.c
servers/lloadd/client.c
servers/lloadd/extended.c

index 4f429602f94a1073e5d713325b626d7efab9165b..537ea093c04a04ff2e34372a41b2294a0dd95bc3 100644 (file)
@@ -244,6 +244,7 @@ request_bind( LloadConnection *client, LloadOperation *op )
     }
 
     tavl_delete( &client->c_ops, op, operation_client_cmp );
+    client->c_n_ops_executing--;
 
     client_reset( client );
 
@@ -326,6 +327,7 @@ request_bind( LloadConnection *client, LloadOperation *op )
 
     rc = tavl_insert( &client->c_ops, op, operation_client_cmp, avl_dup_error );
     assert( rc == LDAP_SUCCESS );
+    client->c_n_ops_executing++;
     CONNECTION_UNLOCK(client);
 
     if ( pin ) {
@@ -663,6 +665,7 @@ handle_bind_response(
     assert( !removed || op == removed );
 
     if ( client->c_state == LLOAD_C_BINDING ) {
+        assert( removed );
         switch ( result ) {
             case LDAP_SASL_BIND_IN_PROGRESS:
                 op->o_saved_msgid = op->o_client_msgid;
@@ -676,6 +679,7 @@ handle_bind_response(
                 client->c_state = LLOAD_C_READY;
                 client->c_type = LLOAD_C_OPEN;
                 client->c_pin_id = 0;
+                client->c_n_ops_executing--;
                 if ( !BER_BVISNULL( &client->c_auth ) ) {
                     if ( result != LDAP_SUCCESS ) {
                         ber_memfree( client->c_auth.bv_val );
@@ -693,6 +697,9 @@ handle_bind_response(
             }
         }
     } else {
+        if ( removed ) {
+            client->c_n_ops_executing--;
+        }
         assert( client->c_state == LLOAD_C_DYING ||
                 client->c_state == LLOAD_C_CLOSING );
     }
@@ -783,6 +790,9 @@ handle_whoami_response(
     removed = tavl_delete( &client->c_ops, op, operation_client_cmp );
     assert( !removed || op == removed );
     op->o_pin_id = 0;
+    if ( removed ) {
+        client->c_n_ops_executing--;
+    }
 
     Debug( LDAP_DEBUG_TRACE, "handle_whoami_response: "
             "connid=%ld new authid=%s\n",
index f03810a3b0017cf6ddaeced91ef09a2cc39cb9b6..64f77beba6085ab11b813a2194b699a6167010ad 100644 (file)
@@ -445,9 +445,12 @@ void
 client_reset( LloadConnection *c )
 {
     TAvlnode *root;
+    long freed = 0, executing;
 
     root = c->c_ops;
     c->c_ops = NULL;
+    executing = c->c_n_ops_executing;
+    c->c_n_ops_executing = 0;
 
     if ( !BER_BVISNULL( &c->c_auth ) ) {
         ch_free( c->c_auth.bv_val );
@@ -460,12 +463,12 @@ client_reset( LloadConnection *c )
     CONNECTION_UNLOCK(c);
 
     if ( root ) {
-        int freed;
         freed = tavl_free( root, (AVL_FREE)operation_abandon );
         Debug( LDAP_DEBUG_TRACE, "client_reset: "
-                "dropped %d operations\n",
+                "dropped %ld operations\n",
                 freed );
     }
+    assert( freed == executing );
 
     CONNECTION_LOCK(c);
 }
index 1f22a71968bc4c37e49bf3689ac58c2f237e1847..d7775fff4c909a169c9129478f875e3f757b0a37 100644 (file)
@@ -32,12 +32,15 @@ int
 handle_starttls( LloadConnection *c, LloadOperation *op )
 {
     struct event_base *base = event_get_base( c->c_read_event );
+    LloadOperation *found;
     BerElement *output;
     char *msg = NULL;
     int rc = LDAP_SUCCESS;
 
     CONNECTION_LOCK(c);
-    tavl_delete( &c->c_ops, op, operation_client_cmp );
+    found = tavl_delete( &c->c_ops, op, operation_client_cmp );
+    assert( op == found );
+    c->c_n_ops_executing--;
 
     if ( c->c_is_tls == LLOAD_TLS_ESTABLISHED ) {
         rc = LDAP_OPERATIONS_ERROR;