]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Do not leak BerElements
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 19 Apr 2017 08:51:47 +0000 (09:51 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:55:46 +0000 (17:55 +0000)
servers/lloadd/client.c
servers/lloadd/connection.c
servers/lloadd/operation.c
servers/lloadd/upstream.c

index bc21baeb152d5c05f1d6e13e10aacc8070c0f492..986c5e85635de64bf7d6d735e78c58d65e3ef574 100644 (file)
@@ -115,6 +115,8 @@ fail:
                 op, LDAP_OTHER, "server error or overloaded", 1 );
         op->o_client = NULL;
         operation_destroy( op );
+    } else if ( ber ) {
+        ber_free( ber, 1 );
     }
 
     client_destroy( c );
index e270bdc0bc07a04c88c309a14b0158c5c279154d..47752eefec13bad15bacf08859e7f13d245e92a8 100644 (file)
@@ -64,6 +64,9 @@ connection_destroy( Connection *c )
     if ( c->c_currentber ) {
         ber_free( c->c_currentber, 1 );
     }
+    if ( c->c_pendingber ) {
+        ber_free( c->c_pendingber, 1 );
+    }
 
     ldap_pvt_thread_mutex_unlock( &c->c_mutex );
 
index 3f4465dae33abea8081c5eddbfbd6549cbb1f0dc..b8f01d4066d0168527820ec3a4b693fc3a461894 100644 (file)
@@ -232,7 +232,7 @@ operation_abandon( Operation *op )
             Debug( LDAP_DEBUG_ANY, "operation_abandon: "
                     "ber_alloc failed\n" );
             ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
-            return;
+            goto done;
         }
         c->c_pendingber = ber;
 
@@ -240,13 +240,15 @@ operation_abandon( Operation *op )
                 LDAP_TAG_MSGID, c->c_next_msgid++,
                 LDAP_REQ_ABANDON, op->o_upstream_msgid );
 
-        ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
-
         if ( rc == -1 ) {
             ber_free( ber, 1 );
-            return;
         }
-        upstream_write_cb( -1, 0, c );
+
+        ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+
+        if ( rc != -1 ) {
+            upstream_write_cb( -1, 0, c );
+        }
     }
 
 done:
index c52e872ffa4f8f4b9190d72c60d9a6b1855e0195..a37fe1c3f25cbc712d7708fe0c44c397a2f52b91 100644 (file)
@@ -572,7 +572,7 @@ upstream_bind_cb( evutil_socket_t s, short what, void *arg )
 {
     Connection *c = arg;
     BerElement *ber;
-    char *matcheddn = NULL, *message = NULL;
+    BerValue matcheddn, message;
     ber_tag_t tag;
     ber_len_t len;
     ber_int_t msgid, result;
@@ -622,7 +622,7 @@ upstream_bind_cb( evutil_socket_t s, short what, void *arg )
         goto fail;
     }
 
-    if ( ber_scanf( ber, "{eAA" /* "}" */, &result, &matcheddn, &message ) ==
+    if ( ber_scanf( ber, "{emm" /* "}" */, &result, &matcheddn, &message ) ==
                  LBER_ERROR ) {
         Debug( LDAP_DEBUG_ANY, "upstream_bind_cb: "
                 "response does not conform with a bind response\n" );
@@ -640,20 +640,16 @@ upstream_bind_cb( evutil_socket_t s, short what, void *arg )
         default:
             Debug( LDAP_DEBUG_ANY, "upstream_bind_cb: "
                     "upstream bind failed, rc=%d, message='%s'\n",
-                    result, message );
+                    result, message.bv_val );
             goto fail;
     }
 
-    if ( matcheddn ) ber_memfree( matcheddn );
-    if ( message ) ber_memfree( message );
-
     ldap_pvt_thread_mutex_unlock( &c->c_mutex );
 
+    ber_free( ber, 1 );
     return;
-fail:
-    if ( matcheddn ) ber_memfree( matcheddn );
-    if ( message ) ber_memfree( message );
 
+fail:
     ber_free( ber, 1 );
     upstream_destroy( c );
 }