]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
In cache, set rdataset TTL to 0 when the header is not active
authorOndřej Surý <ondrej@isc.org>
Sun, 2 Feb 2025 10:44:00 +0000 (11:44 +0100)
committerOndřej Surý <ondrej@isc.org>
Mon, 3 Feb 2025 14:04:36 +0000 (15:04 +0100)
When the header has been marked as ANCIENT, but the ttl hasn't been
reset (this happens in couple of places), the rdataset TTL would be
set to the header timestamp instead to a reasonable TTL value.

Since this header has been already expired (ANCIENT is set), set the
rdataset TTL to 0 and don't reuse this field to print the expiration
time when dumping the cache.  Instead of printing the time, we now
just print 'expired (awaiting cleanup'.

(cherry picked from commit 1bbb57f81b50bb594327428938a129a51d8ca493)

bin/tests/system/serve-stale/tests.sh
lib/dns/masterdump.c
lib/dns/rbtdb.c

index c001e7a071d34971bae24a2004c4529459c4fe29..37dafa33f77657a1e47b017576f42e3238c9ef39 100755 (executable)
@@ -1612,7 +1612,7 @@ if [ $ret != 0 ]; then echo_i "failed"; fi
 status=$((status + ret))
 # Check that expired records are not dumped.
 ret=0
-grep "; expired since .* (awaiting cleanup)" ns5/named_dump.db.test$n && ret=1
+grep "; expired (awaiting cleanup)" ns5/named_dump.db.test$n && ret=1
 if [ $ret != 0 ]; then echo_i "failed"; fi
 status=$((status + ret))
 
@@ -1628,13 +1628,13 @@ status=$((status + ret))
 echo_i "check rndc dump expired data.example ($n)"
 ret=0
 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n \
-  | grep "; expired since .* (awaiting cleanup) data\.example\..*A text record with a 2 second ttl" >/dev/null 2>&1 || ret=1
+  | grep "; expired (awaiting cleanup) data\.example\..*A text record with a 2 second ttl" >/dev/null 2>&1 || ret=1
 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n \
-  | grep "; expired since .* (awaiting cleanup) nodata\.example\." >/dev/null 2>&1 || ret=1
+  | grep "; expired (awaiting cleanup) nodata\.example\." >/dev/null 2>&1 || ret=1
 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n \
-  | grep "; expired since .* (awaiting cleanup) nxdomain\.example\." >/dev/null 2>&1 || ret=1
+  | grep "; expired (awaiting cleanup) nxdomain\.example\." >/dev/null 2>&1 || ret=1
 awk '/; expired/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n \
-  | grep "; expired since .* (awaiting cleanup) othertype\.example\." >/dev/null 2>&1 || ret=1
+  | grep "; expired (awaiting cleanup) othertype\.example\." >/dev/null 2>&1 || ret=1
 # Also make sure the not expired data does not have an expired comment.
 awk '/; authanswer/ { x=$0; getline; print x, $0}' ns5/named_dump.db.test$n \
   | grep "; authanswer longttl\.example.*A text record with a 600 second ttl" >/dev/null 2>&1 || ret=1
index c547f31eaf000f6ca3c8fc49af3a92fe9790d990..5dc474d7453c6e108d88a3a8ab1e2131899df7e1 100644 (file)
@@ -1157,15 +1157,7 @@ again:
                        if (STALE(rds)) {
                                fprintf(f, "; stale\n");
                        } else if (ANCIENT(rds)) {
-                               isc_buffer_t b;
-                               char buf[sizeof("YYYYMMDDHHMMSS")];
-                               memset(buf, 0, sizeof(buf));
-                               isc_buffer_init(&b, buf, sizeof(buf) - 1);
-                               dns_time64_totext((uint64_t)rds->ttl, &b);
-                               fprintf(f,
-                                       "; expired since %s "
-                                       "(awaiting cleanup)\n",
-                                       buf);
+                               fprintf(f, "; expired (awaiting cleanup)\n");
                        }
                        result = dump_rdataset(mctx, name, rds, ctx, buffer, f);
                        if (result != ISC_R_SUCCESS) {
index 6636d4a992ca1a6648b3796fdda8eadececc6add..37bd522ef10a4a11427b790894726bd128ea0488 100644 (file)
@@ -3181,7 +3181,7 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, rdatasetheader_t *header,
                rdataset->attributes |= DNS_RDATASETATTR_STALE;
        } else if (IS_CACHE(rbtdb) && !ACTIVE(header, now)) {
                rdataset->attributes |= DNS_RDATASETATTR_ANCIENT;
-               rdataset->ttl = header->rdh_ttl;
+               rdataset->ttl = 0;
        }
 
        rdataset->private1 = rbtdb;