]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Do not use header_prev in expire_lru_headers
authorMark Andrews <marka@isc.org>
Thu, 22 Feb 2024 23:12:47 +0000 (10:12 +1100)
committerOndřej Surý <ondrej@isc.org>
Fri, 23 Feb 2024 11:40:16 +0000 (12:40 +0100)
dns__cacherbt_expireheader can unlink / free header_prev underneath
it.  Use ISC_LIST_TAIL after calling dns__cacherbt_expireheader
instead to get the next pointer to be processed.

(cherry picked from commit 7ce2e86024f022decb2678963538515ca39ab4ab)

lib/dns/rbtdb.c

index f1fd566e8053bfdce1102d89053b0908f0e0c2cf..abe2d9b49c3a2ebbbb6866545bfdbc53b459b0c8 100644 (file)
@@ -10564,19 +10564,19 @@ update_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header,
 static size_t
 expire_lru_headers(dns_rbtdb_t *rbtdb, unsigned int locknum, size_t purgesize,
                   bool tree_locked) {
-       rdatasetheader_t *header, *header_prev;
+       rdatasetheader_t *header;
        size_t purged = 0;
 
        for (header = ISC_LIST_TAIL(rbtdb->rdatasets[locknum]);
-            header != NULL && purged <= purgesize; header = header_prev)
+            header != NULL && purged <= purgesize;
+            header = ISC_LIST_TAIL(rbtdb->rdatasets[locknum]))
        {
-               header_prev = ISC_LIST_PREV(header, link);
                /*
                 * Unlink the entry at this point to avoid checking it
                 * again even if it's currently used someone else and
                 * cannot be purged at this moment.  This entry won't be
                 * referenced any more (so unlinking is safe) since the
-                * TTL was reset to 0.
+                * TTL will be reset to 0.
                 */
                ISC_LIST_UNLINK(rbtdb->rdatasets[locknum], header, link);
                size_t header_size = rdataset_size(header);