]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[v4_1_esv] Fixed memory leaks in omapi dereferencing
authorThomas Markwalder <tmark@isc.org>
Thu, 5 Nov 2015 13:46:18 +0000 (08:46 -0500)
committerThomas Markwalder <tmark@isc.org>
Thu, 5 Nov 2015 13:46:18 +0000 (08:46 -0500)
    Merges in rt33990.

RELNOTES
common/comapi.c
omapip/hash.c
server/db.c
server/mdb.c
server/omapi.c

index 3eaa364c86d6714e6c058a00ab2d2f4ce7df0b39..d1dc59435f2e8a21ee4e5b2591777ddb28bc5905 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -106,6 +106,11 @@ by Eric Young (eay@cryptsoft.com).
   This is unlikely to cause significant issues in actual use.
   [ISC-Bugs #40990]
 
+- Corrected a few minor memory leaks in omapi's dereferencing of
+  host objects. Thanks to Jiri Popelka at Red Hat for reporting
+  the issue and supplying the patches.
+  [ISC-Bugs #33990]
+
                        Changes since 4.1-ESV-R12b1
 
 - None
index d53c3da5d27e4eddfa69ed00d37cf2ae423c736a..38407b393a8b03cd73e1d4c5c5d3fa907e5a1200 100644 (file)
@@ -3,7 +3,7 @@
    OMAPI object interfaces for the DHCP server. */
 
 /*
- * Copyright (c) 2012,2014 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2012,2014-2015 Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 2004-2007,2009 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 1999-2003 by Internet Software Consortium
  *
@@ -650,14 +650,12 @@ isc_result_t dhcp_subnet_get_value (omapi_object_t *h, omapi_object_t *id,
 
 isc_result_t dhcp_subnet_destroy (omapi_object_t *h, const char *file, int line)
 {
+       struct subnet *subnet;
 
        if (h -> type != dhcp_type_subnet)
                return ISC_R_INVALIDARG;
 
-#if defined (DEBUG_MEMORY_LEAKAGE) || \
-               defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
-       struct subnet *subnet = (struct subnet *)h;
-
+       subnet = (struct subnet *)h;
        if (subnet -> next_subnet)
                subnet_dereference (&subnet -> next_subnet, file, line);
        if (subnet -> next_sibling)
@@ -669,7 +667,6 @@ isc_result_t dhcp_subnet_destroy (omapi_object_t *h, const char *file, int line)
                interface_dereference (&subnet -> interface, file, line);
        if (subnet -> group)
                group_dereference (&subnet -> group, file, line);
-#endif
 
        return ISC_R_SUCCESS;
 }
@@ -797,12 +794,12 @@ isc_result_t dhcp_shared_network_destroy (omapi_object_t *h,
 {
        /* In this function h should be a (struct shared_network *) */
 
+       struct shared_network *shared_network;
+
        if (h -> type != dhcp_type_shared_network)
                return ISC_R_INVALIDARG;
 
-#if defined (DEBUG_MEMORY_LEAKAGE) || \
-               defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
-       struct shared_network *shared_network = (struct shared_network *)h;
+       shared_network = (struct shared_network *)h;
        if (shared_network -> next)
                shared_network_dereference (&shared_network -> next,
                                            file, line);
@@ -826,7 +823,6 @@ isc_result_t dhcp_shared_network_destroy (omapi_object_t *h,
                                      &shared_network -> failover_peer,
                                      file, line);
 #endif
-#endif /* DEBUG_MEMORY_LEAKAGE */
 
        return ISC_R_SUCCESS;
 }
index b75d102b0257389a1dacc76e3d9b2e55623fc849..bb5435acd11fa9a5bd8c9e840b10b93f80d58c00 100644 (file)
@@ -3,7 +3,8 @@
    Routines for manipulating hash tables... */
 
 /*
- * Copyright (c) 2009-2010,2014 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2014-2015 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2009-2010 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 2004-2007 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 1995-2003 by Internet Software Consortium
  *
@@ -108,7 +109,7 @@ void free_hash_table (tp, file, line)
        int i;
        struct hash_bucket *hbc, *hbn = (struct hash_bucket *)0;
 
-       for (i = 0; i < ptr -> hash_count; i++) {
+       for (i = 0; ptr != NULL && i < ptr -> hash_count; i++) {
            for (hbc = ptr -> buckets [i]; hbc; hbc = hbn) {
                hbn = hbc -> next;
                if (ptr -> dereferencer && hbc -> value)
index eefc599aac9355bf7f372e6b7f470cf17cd20740..2cf0b37aca2629aa6547d41ce1fcbf04f9fcdd5a 100644 (file)
@@ -387,10 +387,14 @@ int write_host (host)
                                        ++errors;
                        }
 
+                       /* We're done with ip_addrs so pitch it */
+                       data_string_forget (&ip_addrs, MDL);
+
                        errno = 0;
                        fputc (';', db_file);
                        if (errno)
                                ++errors;
+
                }
 
                if (host -> named_group) {
index 75d7f42b34ce37efe91e1e364493648b7d145153..899aba8df937fa37117584c5266a26ae8a77be02 100644 (file)
@@ -2913,7 +2913,9 @@ void free_everything(void)
 
        cancel_all_timeouts ();
        relinquish_timeouts ();
+#if defined(DELAYED_ACK)
        relinquish_ackqueue();
+#endif
        trace_free_all ();
        group_dereference (&root_group, MDL);
        executable_statement_dereference (&default_classification_rules, MDL);
index e00ae85893ce90dadf496341987cb7fd201856c0..167ba09bcb34c0d036a5182cd3b7ccadd0985d43 100644 (file)
@@ -455,19 +455,19 @@ isc_result_t dhcp_lease_destroy (omapi_object_t *h, const char *file, int line)
                class_dereference
                        (&lease -> billing_class, file, line);
 
-#if defined (DEBUG_MEMORY_LEAKAGE) || \
-               defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
-       /* XXX we should never be destroying a lease with a next
-          XXX pointer except on exit... */
-       if (lease -> next)
-               lease_dereference (&lease -> next, file, line);
-       if (lease -> n_hw)
-               lease_dereference (&lease -> n_hw, file, line);
-       if (lease -> n_uid)
-               lease_dereference (&lease -> n_uid, file, line);
-       if (lease -> next_pending)
-               lease_dereference (&lease -> next_pending, file, line);
-#endif
+       /* We no longer check for a next pointer as that should
+        * be cleared when we destroy the pool and as before we
+        * should only ever be doing that on exit.
+       if (lease->next)
+               lease_dereference (&lease->next, file, line);
+        */
+
+       if (lease->n_hw)
+               lease_dereference (&lease->n_hw, file, line);
+       if (lease->n_uid)
+               lease_dereference (&lease->n_uid, file, line);
+       if (lease->next_pending)
+               lease_dereference (&lease->next_pending, file, line);
 
        return ISC_R_SUCCESS;
 }
@@ -1173,8 +1173,6 @@ isc_result_t dhcp_host_destroy (omapi_object_t *h, const char *file, int line)
        if (h -> type != dhcp_type_host)
                return ISC_R_INVALIDARG;
 
-#if defined (DEBUG_MEMORY_LEAKAGE) || \
-               defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
        struct host_decl *host = (struct host_decl *)h;
        if (host -> n_ipaddr)
                host_dereference (&host -> n_ipaddr, file, line);
@@ -1193,7 +1191,6 @@ isc_result_t dhcp_host_destroy (omapi_object_t *h, const char *file, int line)
                omapi_object_dereference ((omapi_object_t **)
                                          &host -> named_group, file, line);
        data_string_forget (&host -> auth_key_id, file, line);
-#endif
 
        return ISC_R_SUCCESS;
 }
@@ -1247,8 +1244,8 @@ isc_result_t dhcp_host_signal_handler (omapi_object_t *h,
 }
 
 isc_result_t dhcp_host_stuff_values (omapi_object_t *c,
-                                     omapi_object_t *id,
-                                     omapi_object_t *h)
+                                    omapi_object_t *id,
+                                    omapi_object_t *h)
 {
        struct host_decl *host;
        isc_result_t status;
@@ -1269,16 +1266,27 @@ isc_result_t dhcp_host_stuff_values (omapi_object_t *c,
                                   (struct option_state *)0,
                                   &global_scope,
                                   host -> fixed_addr, MDL)) {
+
                status = omapi_connection_put_name (c, "ip-address");
-               if (status != ISC_R_SUCCESS)
+               if (status != ISC_R_SUCCESS) {
+                       data_string_forget (&ip_addrs, MDL);
                        return status;
+               }
+
                status = omapi_connection_put_uint32 (c, ip_addrs.len);
-               if (status != ISC_R_SUCCESS)
+               if (status != ISC_R_SUCCESS) {
+                       data_string_forget (&ip_addrs, MDL);
                        return status;
+               }
+
                status = omapi_connection_copyin (c,
                                                  ip_addrs.data, ip_addrs.len);
-               if (status != ISC_R_SUCCESS)
+               if (status != ISC_R_SUCCESS) { 
+                       data_string_forget (&ip_addrs, MDL);
                        return status;
+               }
+
+               data_string_forget (&ip_addrs, MDL);
        }
 
        if (host -> client_identifier.len) {
@@ -1631,16 +1639,11 @@ isc_result_t dhcp_pool_get_value (omapi_object_t *h, omapi_object_t *id,
 
 isc_result_t dhcp_pool_destroy (omapi_object_t *h, const char *file, int line)
 {
-#if defined (DEBUG_MEMORY_LEAKAGE) || \
-               defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
        struct permit *pc, *pn;
-#endif
 
        if (h -> type != dhcp_type_pool)
                return ISC_R_INVALIDARG;
 
-#if defined (DEBUG_MEMORY_LEAKAGE) || \
-               defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
        struct pool *pool = (struct pool *)h;
        if (pool -> next)
                pool_dereference (&pool -> next, file, line);
@@ -1663,6 +1666,7 @@ isc_result_t dhcp_pool_destroy (omapi_object_t *h, const char *file, int line)
                dhcp_failover_state_dereference (&pool -> failover_peer,
                                                 file, line);
 #endif
+
        for (pc = pool -> permit_list; pc; pc = pn) {
                pn = pc -> next;
                free_permit (pc, file, line);
@@ -1674,7 +1678,6 @@ isc_result_t dhcp_pool_destroy (omapi_object_t *h, const char *file, int line)
                free_permit (pc, file, line);
        }
        pool -> prohibit_list = (struct permit *)0;
-#endif
 
        return ISC_R_SUCCESS;
 }