From: Mark Andrews Date: Thu, 22 Feb 2024 23:12:47 +0000 (+1100) Subject: Do not use header_prev in expire_lru_headers X-Git-Tag: v9.19.22~23^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ce2e86024f022decb2678963538515ca39ab4ab;p=thirdparty%2Fbind9.git Do not use header_prev in expire_lru_headers 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. --- diff --git a/lib/dns/rbt-cachedb.c b/lib/dns/rbt-cachedb.c index 55fe3540e48..08775be8bdb 100644 --- a/lib/dns/rbt-cachedb.c +++ b/lib/dns/rbt-cachedb.c @@ -1643,23 +1643,22 @@ static size_t expire_lru_headers(dns_rbtdb_t *rbtdb, unsigned int locknum, isc_rwlocktype_t *tlocktypep, size_t purgesize DNS__DB_FLARG) { - dns_slabheader_t *header = NULL, *header_prev = NULL; + dns_slabheader_t *header = NULL; size_t purged = 0; for (header = ISC_LIST_TAIL(rbtdb->lru[locknum]); header != NULL && header->last_used <= rbtdb->last_used && purged <= purgesize; - header = header_prev) + header = ISC_LIST_TAIL(rbtdb->lru[locknum])) { size_t header_size = rdataset_size(header); - 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->lru[locknum], header, link); dns__cacherbt_expireheader(header, tlocktypep,