]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1643. [bug] dns_db_closeversion() could leak memory / node
authorMark Andrews <marka@isc.org>
Sun, 23 May 2004 11:05:21 +0000 (11:05 +0000)
committerMark Andrews <marka@isc.org>
Sun, 23 May 2004 11:05:21 +0000 (11:05 +0000)
                        references. [RT #11163]

CHANGES
lib/dns/rbtdb.c

diff --git a/CHANGES b/CHANGES
index ddcfd85377b3a0e620edf98b11698fee6aae76e1..eecb68f9fed83dba456246f4f120e06a57ceb3f3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+1643.  [bug]           dns_db_closeversion() could leak memory / node
+                       references. [RT #11163]
+
 
        --- 9.2.4rc4 released ---
 
index 305e75ee2312335eb0e851aa4dd8c73009267422..ec6c05b404d674fbdfc8d9bb869e17bea9a7505f 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rbtdb.c,v 1.168.2.17 2004/04/15 01:38:07 marka Exp $ */
+/* $Id: rbtdb.c,v 1.168.2.18 2004/05/23 11:05:21 marka Exp $ */
 
 /*
  * Principal Author: Bob Halley
@@ -1003,9 +1003,13 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
                                 * isn't being used by anyone, we can clean
                                 * it up.
                                 */
-                               if (rbtdb->current_version->references == 0)
+                               if (rbtdb->current_version->references == 0) {
                                        cleanup_version =
                                                rbtdb->current_version;
+                                       APPENDLIST(version->changed_list,
+                                                cleanup_version->changed_list,
+                                                  link);
+                               }
                                /*
                                 * Become the current version.
                                 */
@@ -1018,6 +1022,7 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
                                 * We're rolling back this transaction.
                                 */
                                cleanup_list = version->changed_list;
+                               ISC_LIST_INIT(version->changed_list);
                                rollback = ISC_TRUE;
                                cleanup_version = version;
                                rbtdb->future_version = NULL;
@@ -1038,6 +1043,7 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
                                if (least_greater == NULL)
                                        least_greater = rbtdb->current_version;
 
+                               INSIST(version->serial < least_greater->serial);
                                /*
                                 * Is this the least open version?
                                 */
@@ -1058,16 +1064,19 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
                                                   version->changed_list,
                                                   link);
                                }
-                       }
+                       } else if (version->serial == rbtdb->least_serial)
+                               INSIST(EMPTY(version->changed_list));
                        UNLINK(rbtdb->open_versions, version, link);
                }
        }
        least_serial = rbtdb->least_serial;
        UNLOCK(&rbtdb->lock);
 
-       if (cleanup_version != NULL)
+       if (cleanup_version != NULL) {
+               INSIST(EMPTY(cleanup_version->changed_list));
                isc_mem_put(rbtdb->common.mctx, cleanup_version,
                            sizeof *cleanup_version);
+       }
 
        if (!EMPTY(cleanup_list)) {
                for (changed = HEAD(cleanup_list);