]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2269. [contrib] dbus memory leaks and missing va_end calls. [RT #17232]
authorMark Andrews <marka@isc.org>
Sun, 2 Dec 2007 19:20:20 +0000 (19:20 +0000)
committerMark Andrews <marka@isc.org>
Sun, 2 Dec 2007 19:20:20 +0000 (19:20 +0000)
CHANGES
contrib/dbus/dbus_mgr.c
contrib/dbus/dbus_service.c

diff --git a/CHANGES b/CHANGES
index c21de60ecd09715e91975e4747b5b46ccf0fec18..97ddd4ded9053d41fbff625042ee20d52821c889 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2269.  [contrib]       dbus memory leaks and missing va_end calls. [RT #17232]
+
 2268.  [bug]           0.IN-ADDR.ARPA was missing from the empty zones
                        list.
 
index 71e1eacd6b8a0b2c1106b607b539cfd25a643bb0..b744790cfa353bcb13687d167ee6962a21797cd5 100644 (file)
@@ -167,6 +167,9 @@ dbus_mgr_init_dbus(ns_dbus_mgr_t *);
 static isc_result_t
 dbus_mgr_record_initial_fwdtable(ns_dbus_mgr_t *);
 
+static
+dns_fwdtable_t *dbus_mgr_get_fwdtable(void);
+
 static void
 dbus_mgr_free_initial_fwdtable(ns_dbus_mgr_t *);
 
@@ -272,6 +275,8 @@ dbus_mgr_create
     return ISC_R_SUCCESS;
 
  cleanup_mgr:
+    if ( dbus_mgr_get_fwdtable() != NULL)
+       dbus_mgr_free_initial_fwdtable (mgr);
     if( mgr->task != 0L )
        isc_task_detach(&(mgr->task));
     isc_mem_put(mctx, mgr, sizeof(*mgr));
@@ -623,7 +628,7 @@ static void dbus_mgr_record_initial_forwarder( dns_name_t *name, dns_forwarders_
 
     dns_name_init(&(ifwdr->dn), NULL);
     if( dns_name_dupwithoffsets(name, mgr->mctx, &(ifwdr->dn)) != ISC_R_SUCCESS )
-       return;
+       goto namedup_err;
 
     ISC_LIST_INIT(ifwdr->sa);
     
@@ -634,14 +639,27 @@ static void dbus_mgr_record_initial_forwarder( dns_name_t *name, dns_forwarders_
     {
        nsa = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t));
        if( nsa == 0L ) 
-           return;
+           goto nsa_err;
        *nsa = *sa;
        ISC_LINK_INIT(nsa, link);
        ISC_LIST_APPEND(ifwdr->sa, nsa, link);
     }
     ISC_LINK_INIT(ifwdr, link);
     tsearch( ifwdr, &(mgr->ifwdt), dbus_mgr_ifwdr_comparator);
-} 
+
+    return;
+
+nsa_err:
+    while ( (sa = ISC_LIST_HEAD (ifwdr->sa)) != NULL) {
+       ISC_LIST_UNLINK (ifwdr->sa, sa, link);
+       isc_mem_put (mgr->mctx, sa, sizeof (*sa));
+    }
+
+namedup_err:
+    isc_mem_put (mgr->mctx, ifwdr, sizeof (*ifwdr));
+
+    return;
+}
 
 static isc_result_t
 dbus_mgr_record_initial_fwdtable( ns_dbus_mgr_t *mgr )
index 0ed903d07ce1307190982146e439cccb0f1b1181..47d55d588d02c687350509b03af2fbb01547bae4 100644 (file)
@@ -200,6 +200,7 @@ dbus_svc_add_filter
            }
        }
     }
+    va_end(va);
     return( 1 );
 }
 
@@ -424,6 +425,7 @@ dbus_svc_message_append_args(DBusConnectionState *cs, dbus_svc_MessageHandle msg
     if( !dbus_message_append_args_valist( msg, firstType, va ) )
     {
        if( cs->eh != 0L ) (*(cs->eh))("dbus_svc_send: dbus_message_append_args failed");
+       va_end(va);
        return 0;       
     }
     va_end(va);
@@ -488,6 +490,7 @@ dbus_svc_call
        va_end(va);
        return(0L);
     }
+    va_end(va);
     return reply;
 }