]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
RFC 6762 section 7.1: a Multicast DNS querier SHOULD NOT include records in the
authorVishal Chillara Srinivas <vishal.chillarasrinivas@philips.com>
Wed, 15 Jun 2022 12:46:06 +0000 (18:16 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 16 Jun 2022 01:44:25 +0000 (10:44 +0900)
Known-Answer list whose remaining TTL is less than half of their original TTL

src/resolve/resolved-dns-cache.c

index 395109dcb2f2cef3a3e5777fa71a47c5efe00428..0856976d3efdb95df99a47a5300c4f0c98785ff0 100644 (file)
@@ -1245,11 +1245,14 @@ int dns_cache_check_conflicts(DnsCache *cache, DnsResourceRecord *rr, int owner_
 int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p) {
         unsigned ancount = 0;
         DnsCacheItem *i;
+        usec_t t;
         int r;
 
         assert(cache);
         assert(p);
 
+        t = now(CLOCK_BOOTTIME);
+
         HASHMAP_FOREACH(i, cache->by_key)
                 LIST_FOREACH(by_key, j, i) {
                         if (!j->rr)
@@ -1258,6 +1261,11 @@ int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p) {
                         if (!j->shared_owner)
                                 continue;
 
+                        /* RFC6762 7.1: Don't append records with less than half the TTL remaining
+                         * as known answers. */
+                        if (usec_sub_unsigned(j->until, t) < j->rr->ttl * USEC_PER_SEC / 2)
+                                continue;
+
                         r = dns_packet_append_rr(p, j->rr, 0, NULL, NULL);
                         if (r == -EMSGSIZE && p->protocol == DNS_PROTOCOL_MDNS) {
                                 /* For mDNS, if we're unable to stuff all known answers into the given packet,