]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Make sure operation stays alive when we process it
authorOndřej Kuzník <ondra@mistotebe.net>
Fri, 23 Jun 2017 10:09:03 +0000 (11:09 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:55:46 +0000 (17:55 +0000)
servers/lloadd/upstream.c

index 3b00ca5446b1251926143ad4ddc4c6698fa1b157..7557ca48de0c3d5e6103930d2678e5400a4c4056 100644 (file)
@@ -401,6 +401,7 @@ handle_one_response( Connection *c )
         client = op->o_client;
         if ( client ) {
             CONNECTION_LOCK(client);
+            op->o_client_refcnt++;
             CONNECTION_UNLOCK_INCREF(client);
         }
         ldap_pvt_thread_mutex_unlock( &operation_mutex );
@@ -408,6 +409,10 @@ handle_one_response( Connection *c )
         if ( client ) {
             rc = handler( op, ber );
             CONNECTION_LOCK_DECREF(client);
+            op->o_client_refcnt--;
+            if ( !op->o_client_refcnt ) {
+                operation_destroy_from_client( op );
+            }
             CLIENT_UNLOCK_OR_DESTROY(client);
         } else {
             ber_free( ber, 1 );
@@ -415,7 +420,7 @@ handle_one_response( Connection *c )
 
         CONNECTION_LOCK_DECREF(c);
         op->o_upstream_refcnt--;
-        if ( !client || !op->o_upstream_live ) {
+        if ( !client || !op->o_upstream_refcnt ) {
             operation_destroy_from_upstream( op );
         }
     } else {