From: Ondřej Kuzník Date: Tue, 30 Aug 2022 12:25:18 +0000 (+0100) Subject: ITS#9907 Plug shutdown related leaks in lloadd X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=333d61d7ebe2dedcff91948de9bfb2f23175a95e;p=thirdparty%2Fopenldap.git ITS#9907 Plug shutdown related leaks in lloadd --- diff --git a/servers/lloadd/config.c b/servers/lloadd/config.c index cabef479c6..1d64c58d5a 100644 --- a/servers/lloadd/config.c +++ b/servers/lloadd/config.c @@ -1319,14 +1319,15 @@ config_bindconf( ConfigArgs *c ) } if ( !BER_BVISNULL( &bindconf.sb_authzId ) ) { - ber_dupbv( &lloadd_identity, &bindconf.sb_authzId ); + ber_bvreplace( &lloadd_identity, &bindconf.sb_authzId ); } else if ( !BER_BVISNULL( &bindconf.sb_authcId ) ) { - ber_dupbv( &lloadd_identity, &bindconf.sb_authcId ); + ber_bvreplace( &lloadd_identity, &bindconf.sb_authcId ); } else if ( !BER_BVISNULL( &bindconf.sb_binddn ) ) { char *ptr; lloadd_identity.bv_len = STRLENOF("dn:") + bindconf.sb_binddn.bv_len; - lloadd_identity.bv_val = ch_malloc( lloadd_identity.bv_len + 1 ); + lloadd_identity.bv_val = ch_realloc( + lloadd_identity.bv_val, lloadd_identity.bv_len + 1 ); ptr = lutil_strcopy( lloadd_identity.bv_val, "dn:" ); ptr = lutil_strncopy( @@ -1552,10 +1553,12 @@ config_tier( ConfigArgs *c ) if ( CONFIG_ONLINE_ADD( c ) ) { assert( tier ); lload_change.target = tier; + ch_free( c->value_string ); return rc; } tier_impl = lload_tier_find( c->value_string ); + ch_free( c->value_string ); if ( !tier_impl ) { goto fail; } diff --git a/servers/lloadd/daemon.c b/servers/lloadd/daemon.c index 413c39505c..1610dbef32 100644 --- a/servers/lloadd/daemon.c +++ b/servers/lloadd/daemon.c @@ -779,6 +779,9 @@ lloadd_daemon_destroy( void ) } } + event_free( lload_stats_event ); + event_free( lload_timeout_event ); + event_base_free( daemon_base ); daemon_base = NULL; diff --git a/servers/lloadd/extended.c b/servers/lloadd/extended.c index 8b72454aa7..c49623e85a 100644 --- a/servers/lloadd/extended.c +++ b/servers/lloadd/extended.c @@ -211,3 +211,10 @@ lload_exop_init( void ) return LDAP_SUCCESS; } + +void +lload_exop_destroy( void ) +{ + ldap_avl_free( lload_exop_handlers, NULL ); + lload_exop_handlers = NULL; +} diff --git a/servers/lloadd/init.c b/servers/lloadd/init.c index 21b72b53f8..72e0536d23 100644 --- a/servers/lloadd/init.c +++ b/servers/lloadd/init.c @@ -105,6 +105,37 @@ lload_global_init( void ) return 0; } +int +lload_global_destroy( void ) +{ + if ( !BER_BVISNULL( &lloadd_identity ) ) { + ch_free( lloadd_identity.bv_val ); + BER_BVZERO( &lloadd_identity ); + } + + lload_exop_destroy(); + +#ifdef HAVE_TLS + if ( lload_tls_backend_ld ) { + ldap_unbind_ext( lload_tls_backend_ld, NULL, NULL ); + } + if ( lload_tls_ld ) { + ldap_unbind_ext( lload_tls_ld, NULL, NULL ); + } +#endif + + ldap_pvt_thread_mutex_destroy( &lload_wait_mutex ); + ldap_pvt_thread_cond_destroy( &lload_wait_cond ); + ldap_pvt_thread_cond_destroy( &lload_pause_cond ); + + ldap_pvt_thread_mutex_destroy( &clients_mutex ); + ldap_pvt_thread_mutex_destroy( &lload_pin_mutex ); + + lload_libevent_destroy(); + + return 0; +} + int lload_tls_init( void ) { diff --git a/servers/lloadd/main.c b/servers/lloadd/main.c index 4b7225ae90..1c76ef3536 100644 --- a/servers/lloadd/main.c +++ b/servers/lloadd/main.c @@ -870,6 +870,7 @@ destroy: (void)loglevel_print( stdout ); } /* remember an error during destroy */ + rc |= lload_global_destroy(); rc |= lload_destroy(); stop: diff --git a/servers/lloadd/module_init.c b/servers/lloadd/module_init.c index 1475538cec..19323c7313 100644 --- a/servers/lloadd/module_init.c +++ b/servers/lloadd/module_init.c @@ -140,6 +140,12 @@ lload_back_close( BackendInfo *bi ) return 0; } +int +lload_back_destroy( BackendInfo *bi ) +{ + return lload_global_destroy(); +} + int lload_back_initialize( BackendInfo *bi ) { @@ -149,7 +155,7 @@ lload_back_initialize( BackendInfo *bi ) bi->bi_pause = lload_pause_cb; bi->bi_unpause = lload_unpause_cb; bi->bi_close = lload_back_close; - bi->bi_destroy = 0; + bi->bi_destroy = lload_back_destroy; bi->bi_db_init = 0; bi->bi_db_config = 0; diff --git a/servers/lloadd/proto-lload.h b/servers/lloadd/proto-lload.h index b73fe8818e..f69111e178 100644 --- a/servers/lloadd/proto-lload.h +++ b/servers/lloadd/proto-lload.h @@ -143,11 +143,13 @@ LDAP_SLAPD_V (Avlnode *) lload_exop_handlers; LDAP_SLAPD_F (int) exop_handler_cmp( const void *l, const void *r ); LDAP_SLAPD_F (int) request_extended( LloadConnection *c, LloadOperation *op ); LDAP_SLAPD_F (int) lload_exop_init( void ); +LDAP_SLAPD_F (void) lload_exop_destroy( void ); /* * init.c */ LDAP_SLAPD_F (int) lload_global_init( void ); +LDAP_SLAPD_F (int) lload_global_destroy( void ); LDAP_SLAPD_F (int) lload_tls_init( void ); LDAP_SLAPD_F (int) lload_init( int mode, const char *name ); LDAP_SLAPD_F (int) lload_destroy( void );