]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
fix and simplify dns_rdataset_equal() and _equalx()
authorEvan Hunt <each@isc.org>
Thu, 6 Feb 2025 23:50:52 +0000 (15:50 -0800)
committerEvan Hunt <each@isc.org>
Wed, 19 Feb 2025 22:58:32 +0000 (14:58 -0800)
if both rdataslabs being compared have zero length, return true.

also, since these functions are only ever called on slabheaders
with sizeof(dns_slabheader_t) as the reserve length, we can
simplify the API: remove the reservelen argument, and pass the
slabs as type dns_slabheader_t * instead of unsigned char *.

lib/dns/include/dns/rdataslab.h
lib/dns/qpcache.c
lib/dns/rdataslab.c

index c81fe9777f3b48ba8c526b908dfdd18d76c106ce..15437f0d4ae72818d4ad2657c9064e6717b791da 100644 (file)
@@ -251,8 +251,7 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
  */
 
 bool
-dns_rdataslab_equal(unsigned char *slab1, unsigned char *slab2,
-                   unsigned int reservelen);
+dns_rdataslab_equal(dns_slabheader_t *slab1, dns_slabheader_t *slab2);
 /*%<
  * Compare two rdataslabs for equality.  This does _not_ do a full
  * DNSSEC comparison.
@@ -264,9 +263,8 @@ dns_rdataslab_equal(unsigned char *slab1, unsigned char *slab2,
  *\li  true if the slabs are equal, false otherwise.
  */
 bool
-dns_rdataslab_equalx(unsigned char *slab1, unsigned char *slab2,
-                    unsigned int reservelen, dns_rdataclass_t rdclass,
-                    dns_rdatatype_t type);
+dns_rdataslab_equalx(dns_slabheader_t *slab1, dns_slabheader_t *slab2,
+                    dns_rdataclass_t rdclass, dns_rdatatype_t type);
 /*%<
  * Compare two rdataslabs for DNSSEC equality.
  *
index c5ea5a1e31c1b0b3b447737c56a54572d007aac0..f63be9ec44d9e21f2258097e1b6bfe6004205596 100644 (file)
@@ -2884,9 +2884,7 @@ find_header:
                if (ACTIVE(header, now) && header->type == dns_rdatatype_ns &&
                    EXISTS(header) && EXISTS(newheader) &&
                    header->trust >= newheader->trust &&
-                   dns_rdataslab_equalx((unsigned char *)header,
-                                        (unsigned char *)newheader,
-                                        (unsigned int)(sizeof(*newheader)),
+                   dns_rdataslab_equalx(header, newheader,
                                         qpdb->common.rdclass,
                                         (dns_rdatatype_t)header->type))
                {
@@ -2950,9 +2948,7 @@ find_header:
                     header->type == DNS_SIGTYPE(dns_rdatatype_ds)) &&
                    EXISTS(header) && EXISTS(newheader) &&
                    header->trust >= newheader->trust &&
-                   dns_rdataslab_equal((unsigned char *)header,
-                                       (unsigned char *)newheader,
-                                       (unsigned int)(sizeof(*newheader))))
+                   dns_rdataslab_equal(header, newheader))
                {
                        /*
                         * Honour the new ttl if it is less than the
index ce0dfeb3f4070093adeb9c669de0646b361d20f8..27f85fc2f48c87aa3ee9e8c68b920ac450056fc0 100644 (file)
@@ -714,20 +714,21 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
 }
 
 bool
-dns_rdataslab_equal(unsigned char *slab1, unsigned char *slab2,
-                   unsigned int reservelen) {
+dns_rdataslab_equal(dns_slabheader_t *slab1, dns_slabheader_t *slab2) {
        unsigned char *current1 = NULL, *current2 = NULL;
        unsigned int count1, count2;
        unsigned int length1, length2;
 
-       current1 = slab1 + reservelen;
+       current1 = (unsigned char *)slab1 + sizeof(dns_slabheader_t);
        count1 = get_uint16(current1);
 
-       current2 = slab2 + reservelen;
+       current2 = (unsigned char *)slab2 + sizeof(dns_slabheader_t);
        count2 = get_uint16(current2);
 
        if (count1 != count2) {
                return false;
+       } else if (count1 == 0) {
+               return true;
        }
 
        while (count1-- > 0) {
@@ -747,22 +748,23 @@ dns_rdataslab_equal(unsigned char *slab1, unsigned char *slab2,
 }
 
 bool
-dns_rdataslab_equalx(unsigned char *slab1, unsigned char *slab2,
-                    unsigned int reservelen, dns_rdataclass_t rdclass,
-                    dns_rdatatype_t type) {
+dns_rdataslab_equalx(dns_slabheader_t *slab1, dns_slabheader_t *slab2,
+                    dns_rdataclass_t rdclass, dns_rdatatype_t type) {
        unsigned char *current1 = NULL, *current2 = NULL;
        unsigned int count1, count2;
        dns_rdata_t rdata1 = DNS_RDATA_INIT;
        dns_rdata_t rdata2 = DNS_RDATA_INIT;
 
-       current1 = slab1 + reservelen;
+       current1 = (unsigned char *)slab1 + sizeof(dns_slabheader_t);
        count1 = get_uint16(current1);
 
-       current2 = slab2 + reservelen;
+       current2 = (unsigned char *)slab2 + sizeof(dns_slabheader_t);
        count2 = get_uint16(current2);
 
        if (count1 != count2) {
                return false;
+       } else if (count1 == 0) {
+               return true;
        }
 
        while (count1-- > 0) {