ITS#10265 lloadd: Plug shutdown leaks

This commit is contained in:
Ondřej Kuzník 2026-04-29 14:42:26 +01:00 committed by Quanah Gibson-Mount
parent c27f848927
commit 7a2ef5486b
3 changed files with 11 additions and 8 deletions

View 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 );

View 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 );

View 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 );