]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9906 Do not leak cn=monitor related allocs in lloadd
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 30 Aug 2022 12:21:32 +0000 (13:21 +0100)
committerOndřej Kuzník <ondra@mistotebe.net>
Thu, 1 Sep 2022 09:09:15 +0000 (10:09 +0100)
servers/lloadd/monitor.c
servers/lloadd/tier.c

index fcc78cc88e1495d2d5a150c13e2289fdb8e969db..f3da2caaf762060e4271b2d177c04af3ad890f32 100644 (file)
@@ -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
index 8d4cc5327d8bfcbbcab2f1d97ad751127358c53f..e8ea4e82ebb5ed3862f73910932a552f6271928b 100644 (file)
@@ -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;
 }