]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#10265 lloadd: Plug shutdown leaks
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 29 Apr 2026 13:42:26 +0000 (14:42 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 30 Apr 2026 15:14:09 +0000 (15:14 +0000)
servers/lloadd/daemon.c
servers/lloadd/init.c
servers/lloadd/proto-lload.h

index 15561aa9c41338301a1557572acaa479ab8dc6ef..0a8a6982c1db21e151c6283e1d4391f2befb61f2 100644 (file)
@@ -704,15 +704,13 @@ lloadd_daemon_destroy( void )
     return 0;
 }
 
-static void
-destroy_listeners( void )
+void
+lloadd_listeners_destroy( void )
 {
     LloadListener *l, **ll = lload_listeners;
 
     if ( ll == NULL ) return;
 
-    ldap_pvt_thread_join( listener_tid, (void *)NULL );
-
     while ( (l = *ll++) != NULL ) {
         lload_listener_free( l );
     }
@@ -1301,11 +1299,11 @@ lloadd_daemon( struct event_base *daemon_base )
             "Main event loop finished: rc=%d\n",
             rc );
 
-    /* shutdown */
-    event_base_loopexit( listener_base, 0 );
+    /* Shutdown: */
 
     /* wait for the listener threads to complete */
-    destroy_listeners();
+    event_base_loopexit( listener_base, 0 );
+    ldap_pvt_thread_join( listener_tid, (void *)NULL );
 
     /* Mark upstream connections closing and prevent from opening new ones */
     lload_tiers_shutdown();
@@ -1338,7 +1336,6 @@ lloadd_daemon( struct event_base *daemon_base )
 
     lload_tiers_destroy();
     clients_destroy( 0 );
-    lload_bindconf_free( &bindconf );
     evdns_base_free( dnsbase, 0 );
 
     ch_free( daemon_tid );
index 504c1a3cacd5c18890622bcf5cce632eb27fabde..42cb67dab3dcb747481b3ed07c5800f786f648af 100644 (file)
@@ -112,11 +112,16 @@ lload_global_destroy( void )
         ch_free( lloadd_identity.bv_val );
         BER_BVZERO( &lloadd_identity );
     }
+    lload_bindconf_free( &bindconf );
 
     lload_exop_destroy();
     ldap_tavl_free( lload_control_actions, (AVL_FREE)lload_restriction_free );
     ldap_tavl_free( lload_exop_actions, (AVL_FREE)lload_restriction_free );
 
+    lloadd_listeners_destroy();
+    /* All closed at shutdown but tools don't go through shutdown */
+    lload_tiers_destroy();
+
 #ifdef HAVE_TLS
     if ( lload_tls_backend_ld ) {
         ldap_unbind_ext( lload_tls_backend_ld, NULL, NULL );
index 4b214894c9f26d310f930f51a6c3fea5a0903118..3d0e01a3e970bdb26685e8b011175f637f6f6e39 100644 (file)
@@ -116,6 +116,7 @@ LDAP_SLAPD_F (void) connections_walk( ldap_pvt_thread_mutex_t *cq_mutex, lload_c
 LDAP_SLAPD_F (LloadListener *) lload_configure_listener( const char *url, LDAPURLDesc *lud );
 LDAP_SLAPD_F (int) lload_open_new_listener( LloadListener *lr );
 LDAP_SLAPD_F (int) lloadd_listeners_init( const char *urls );
+LDAP_SLAPD_F (void) lloadd_listeners_destroy( void );
 LDAP_SLAPD_F (int) lloadd_daemon_destroy( void );
 LDAP_SLAPD_F (int) lloadd_daemon( struct event_base *daemon_base );
 LDAP_SLAPD_F (LloadListener **) lloadd_get_listeners( void );