From: Ondřej Kuzník Date: Tue, 30 Aug 2022 12:21:32 +0000 (+0100) Subject: ITS#9906 Do not leak cn=monitor related allocs in lloadd X-Git-Tag: OPENLDAP_REL_ENG_2_6_4~107 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fcfa94f89fbf1b5ea01280984a8caa97c9a9d3ba;p=thirdparty%2Fopenldap.git ITS#9906 Do not leak cn=monitor related allocs in lloadd --- diff --git a/servers/lloadd/monitor.c b/servers/lloadd/monitor.c index fcc78cc88e..f3da2caaf7 100644 --- a/servers/lloadd/monitor.c +++ b/servers/lloadd/monitor.c @@ -277,6 +277,16 @@ static struct { static int lload_monitor_subsystem_destroy( BackendDB *be, monitor_subsys_t *ms ) { + ch_free( ms->mss_dn.bv_val ); + ch_free( ms->mss_ndn.bv_val ); + return LDAP_SUCCESS; +} + +static int +lload_monitor_subsystem_free( BackendDB *be, monitor_subsys_t *ms ) +{ + lload_monitor_subsystem_destroy( be, ms ); + ch_free( ms ); return LDAP_SUCCESS; } @@ -287,16 +297,14 @@ lload_monitor_backend_destroy( BackendDB *be, monitor_subsys_t *ms ) monitor_extra_t *mbe; int rc = LDAP_SUCCESS; + ms->mss_destroy = lload_monitor_subsystem_free; + mbe = (monitor_extra_t *)be->bd_info->bi_extra; if ( b->b_monitor ) { - ms->mss_destroy = lload_monitor_subsystem_destroy; - assert( b->b_monitor == ms ); b->b_monitor = NULL; rc = mbe->unregister_entry( &ms->mss_ndn ); - ber_memfree( ms->mss_dn.bv_val ); - ber_memfree( ms->mss_ndn.bv_val ); } return rc; @@ -306,19 +314,21 @@ static int lload_monitor_tier_destroy( BackendDB *be, monitor_subsys_t *ms ) { LloadTier *tier = ms->mss_private; - monitor_extra_t *mbe; - mbe = (monitor_extra_t *)be->bd_info->bi_extra; - if ( tier->t_monitor ) { - ms->mss_destroy = lload_monitor_subsystem_destroy; + assert( slapd_shutdown || ( tier && tier->t_monitor == ms ) ); + + ms->mss_destroy = lload_monitor_subsystem_free; + + if ( !slapd_shutdown ) { + monitor_extra_t *mbe; - assert( tier->t_monitor == ms ); tier->t_monitor = NULL; + mbe = (monitor_extra_t *)be->bd_info->bi_extra; return mbe->unregister_entry( &ms->mss_ndn ); } - return LDAP_SUCCESS; + return ms->mss_destroy( be, ms ); } static void diff --git a/servers/lloadd/tier.c b/servers/lloadd/tier.c index 8d4cc5327d..e8ea4e82eb 100644 --- a/servers/lloadd/tier.c +++ b/servers/lloadd/tier.c @@ -73,19 +73,26 @@ tier_destroy( LloadTier *tier ) #ifdef BALANCER_MODULE if ( tier->t_monitor ) { - BackendDB *be; - struct berval monitordn = BER_BVC("cn=monitor"); - int rc; - - be = select_backend( &monitordn, 0 ); - /* FIXME: implement proper subsys shutdown in back-monitor or make * backend just an entry, not a subsys */ - rc = tier->t_monitor->mss_destroy( be, tier->t_monitor ); - assert( rc == LDAP_SUCCESS ); + if ( slapd_shutdown ) { + /* Just drop backlink, back-monitor will call mss_destroy later */ + assert( tier->t_monitor->mss_private == tier ); + tier->t_monitor->mss_private = NULL; + } else { + BackendDB *be; + struct berval monitordn = BER_BVC("cn=monitor"); + int rc; + + be = select_backend( &monitordn, 0 ); + + rc = tier->t_monitor->mss_destroy( be, tier->t_monitor ); + assert( rc == LDAP_SUCCESS ); + } } #endif /* BALANCER_MODULE */ + ch_free( tier->t_name.bv_val ); ch_free( tier ); return LDAP_SUCCESS; }