]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1547. [bug] Named wasted memory recording duplicate lame zone
authorMark Andrews <marka@isc.org>
Mon, 5 Jan 2004 06:44:30 +0000 (06:44 +0000)
committerMark Andrews <marka@isc.org>
Mon, 5 Jan 2004 06:44:30 +0000 (06:44 +0000)
                        entries. [RT #9341]

CHANGES
lib/dns/adb.c

diff --git a/CHANGES b/CHANGES
index 9551ca103d4abc55f47cdc025c560afc3ae54a60..324f5f8493998e62a66700f71cc9b7484ecb9ffe 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+1547.  [bug]           Named wasted memory recording duplicate lame zone
+                       entries. [RT #9341]
+
 1546.  [bug]           We were rejecting valid secure CNAME to negative
                        answers.
 
index e05affd0b43150b76bf15fd1e97e5e25d44b98cb..e3ea87610230af2791653a308ff945338afcd6a2 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: adb.c,v 1.211 2003/10/25 00:31:08 jinmei Exp $ */
+/* $Id: adb.c,v 1.212 2004/01/05 06:44:30 marka Exp $ */
 
 /*
  * Implementation notes
@@ -3313,20 +3313,32 @@ dns_adb_marklame(dns_adb_t *adb, dns_adbaddrinfo_t *addr, dns_name_t *zone,
 {
        dns_adbzoneinfo_t *zi;
        int bucket;
+       isc_result_t result = ISC_R_SUCCESS;
 
        REQUIRE(DNS_ADB_VALID(adb));
        REQUIRE(DNS_ADBADDRINFO_VALID(addr));
        REQUIRE(zone != NULL);
 
+       bucket = addr->entry->lock_bucket;
+       LOCK(&adb->entrylocks[bucket]);
+       zi = ISC_LIST_HEAD(addr->entry->zoneinfo);
+       while (zi != NULL && dns_name_equal(zone, &zi->zone))
+               zi = ISC_LIST_NEXT(zi, plink);
+       if (zi != NULL) {
+               if (expire_time > zi->lame_timer)
+                       zi->lame_timer = expire_time;
+               goto unlock;
+       }
        zi = new_adbzoneinfo(adb, zone);
-       if (zi == NULL)
-               return (ISC_R_NOMEMORY);
+       if (zi == NULL) {
+               result = ISC_R_NOMEMORY;
+               goto unlock;
+       }
 
        zi->lame_timer = expire_time;
 
-       bucket = addr->entry->lock_bucket;
-       LOCK(&adb->entrylocks[bucket]);
        ISC_LIST_PREPEND(addr->entry->zoneinfo, zi, plink);
+ unlock:
        UNLOCK(&adb->entrylocks[bucket]);
 
        return (ISC_R_SUCCESS);