We do not order RRsets and we are not interested in partial RRsets.
authorflorian <florian@openbsd.org>
Sat, 25 Jun 2022 09:40:20 +0000 (09:40 +0000)
committerflorian <florian@openbsd.org>
Sat, 25 Jun 2022 09:40:20 +0000 (09:40 +0000)
OK sthen

usr.bin/dig/lib/dns/include/dns/message.h
usr.bin/dig/lib/dns/include/dns/rdataset.h
usr.bin/dig/lib/dns/message.c
usr.bin/dig/lib/dns/rdataset.c

index a70720e..7f54741 100644 (file)
@@ -226,9 +226,6 @@ struct dns_message {
        dns_rcode_t                     sig0status;
        isc_region_t                    query;
        isc_region_t                    saved;
-
-       dns_rdatasetorderfunc_t         order;
-       const void *                    order_arg;
 };
 
 struct dns_ednsopt {
index 418c9b5..27f75e4 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rdataset.h,v 1.10 2020/09/14 08:40:43 florian Exp $ */
+/* $Id: rdataset.h,v 1.11 2022/06/25 09:40:20 florian Exp $ */
 
 #ifndef DNS_RDATASET_H
 #define DNS_RDATASET_H 1
@@ -182,8 +182,6 @@ struct dns_rdataset {
 #define DNS_RDATASETATTR_NCACHE                0x00000080      /*%< Used by resolver. */
 #define DNS_RDATASETATTR_CHAINING      0x00000100      /*%< Used by resolver. */
 #define DNS_RDATASETATTR_TTLADJUSTED   0x00000200      /*%< Used by message.c */
-#define DNS_RDATASETATTR_FIXEDORDER    0x00000400
-#define DNS_RDATASETATTR_RANDOMIZE     0x00000800
 #define DNS_RDATASETATTR_CHASE         0x00001000      /*%< Used by resolver. */
 #define DNS_RDATASETATTR_NXDOMAIN      0x00002000
 #define DNS_RDATASETATTR_NOQNAME       0x00004000
@@ -388,8 +386,6 @@ dns_rdataset_towiresorted(dns_rdataset_t *rdataset,
                          const dns_name_t *owner_name,
                          dns_compress_t *cctx,
                          isc_buffer_t *target,
-                         dns_rdatasetorderfunc_t order,
-                         const void *order_arg,
                          unsigned int *countp);
 /*%<
  * Like dns_rdataset_towire(), but sorting the rdatasets according to
index 640ef49..24b3069 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: message.c,v 1.18 2020/11/01 07:12:14 florian Exp $ */
+/* $Id: message.c,v 1.19 2022/06/25 09:40:20 florian Exp $ */
 
 /*! \file */
 
@@ -333,8 +333,6 @@ msginit(dns_message_t *m) {
        m->tcp_continuation = 0;
        m->verified_sig = 0;
        m->verify_attempted = 0;
-       m->order = NULL;
-       m->order_arg = NULL;
        m->query.base = NULL;
        m->query.length = 0;
        m->free_query = 0;
@@ -1657,8 +1655,6 @@ dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid)
                                                  name,
                                                  msg->cctx,
                                                  msg->buffer,
-                                                 msg->order,
-                                                 msg->order_arg,
                                                  &count);
 
                                total += count;
index 610b3c4..fbc5935 100644 (file)
@@ -220,32 +220,21 @@ dns_rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
 }
 
 #define MAX_SHUFFLE    32
-#define WANT_FIXED(r)  (((r)->attributes & DNS_RDATASETATTR_FIXEDORDER) != 0)
-#define WANT_RANDOM(r) (((r)->attributes & DNS_RDATASETATTR_RANDOMIZE) != 0)
 
 struct towire_sort {
        int key;
        dns_rdata_t *rdata;
 };
 
-static int
-towire_compare(const void *av, const void *bv) {
-       const struct towire_sort *a = (const struct towire_sort *) av;
-       const struct towire_sort *b = (const struct towire_sort *) bv;
-       return (a->key - b->key);
-}
-
 static isc_result_t
 towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
-            dns_compress_t *cctx, isc_buffer_t *target,
-            dns_rdatasetorderfunc_t order, const void *order_arg,
-            int partial, unsigned int *countp)
+            dns_compress_t *cctx, isc_buffer_t *target, unsigned int *countp)
 {
        dns_rdata_t rdata = DNS_RDATA_INIT;
        isc_region_t r;
        isc_result_t result;
-       unsigned int i, count = 0, added, choice;
-       isc_buffer_t savedbuffer, rdlen, rrbuffer;
+       unsigned int i, count = 0, added;
+       isc_buffer_t savedbuffer, rdlen;
        unsigned int headlen;
        int question = 0;
        int shuffle = 0;
@@ -259,7 +248,6 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
 
        REQUIRE(rdataset->methods != NULL);
        REQUIRE(countp != NULL);
-       REQUIRE((order == NULL) == (order_arg == NULL));
        REQUIRE(cctx != NULL);
 
        if ((rdataset->attributes & DNS_RDATASETATTR_QUESTION) != 0) {
@@ -279,9 +267,7 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
        /*
         * Do we want to shuffle this answer?
         */
-       if (!question && count > 1 &&
-           (!WANT_FIXED(rdataset) || order != NULL) &&
-           rdataset->type != dns_rdatatype_rrsig)
+       if (!question && count > 1 && rdataset->type != dns_rdatatype_rrsig)
                shuffle = 1;
 
        if (shuffle && count > MAX_SHUFFLE) {
@@ -295,6 +281,9 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
        }
 
        if (shuffle) {
+               uint32_t val;
+               unsigned int j;
+
                /*
                 * First we get handles to all of the rdata.
                 */
@@ -313,60 +302,22 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
                /*
                 * Now we shuffle.
                 */
-               if (WANT_FIXED(rdataset)) {
-                       /*
-                        * 'Fixed' order.
-                        */
-                       INSIST(order != NULL);
-                       for (i = 0; i < count; i++) {
-                               out[i].key = (*order)(&in[i], order_arg);
-                               out[i].rdata = &in[i];
-                       }
-               } else if (WANT_RANDOM(rdataset)) {
-                       /*
-                        * 'Random' order.
-                        */
-                       for (i = 0; i < count; i++) {
-                               choice = i + arc4random_uniform(count - i);
-                               rdata = in[i];
-                               in[i] = in[choice];
-                               in[choice] = rdata;
-                               if (order != NULL)
-                                       out[i].key = (*order)(&in[i],
-                                                             order_arg);
-                               else
-                                       out[i].key = 0; /* Unused */
-                               out[i].rdata = &in[i];
-                       }
-               } else {
-                       /*
-                        * "Cyclic" order.
-                        */
-                       uint32_t val;
-                       unsigned int j;
-
-                       val = rdataset->count;
-                       if (val == UINT32_MAX)
-                               val = arc4random();
-                       j = val % count;
-                       for (i = 0; i < count; i++) {
-                               if (order != NULL)
-                                       out[i].key = (*order)(&in[j],
-                                                             order_arg);
-                               else
-                                       out[i].key = 0; /* Unused */
-                               out[i].rdata = &in[j];
-                               j++;
-                               if (j == count)
-                                       j = 0; /* Wrap around. */
-                       }
-               }
 
                /*
-                * Sorted order.
+                * "Cyclic" order.
                 */
-               if (order != NULL)
-                       qsort(out, count, sizeof(out[0]), towire_compare);
+
+               val = rdataset->count;
+               if (val == UINT32_MAX)
+                       val = arc4random();
+               j = val % count;
+               for (i = 0; i < count; i++) {
+                       out[i].key = 0; /* Unused */
+                       out[i].rdata = &in[j];
+                       j++;
+                       if (j == count)
+                               j = 0; /* Wrap around. */
+               }
        }
 
        savedbuffer = *target;
@@ -378,7 +329,6 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
                 * Copy out the name, type, class, ttl.
                 */
 
-               rrbuffer = *target;
                dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
                result = dns_name_towire(owner_name, cctx, target);
                if (result != ISC_R_SUCCESS)
@@ -443,13 +393,6 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
        goto cleanup;
 
  rollback:
-       if (partial && result == ISC_R_NOSPACE) {
-               INSIST(rrbuffer.used < 65536);
-               dns_compress_rollback(cctx, (uint16_t)rrbuffer.used);
-               *countp += added;
-               *target = rrbuffer;
-               goto cleanup;
-       }
        INSIST(savedbuffer.used < 65536);
        dns_compress_rollback(cctx, (uint16_t)savedbuffer.used);
        *countp = 0;
@@ -468,12 +411,9 @@ dns_rdataset_towiresorted(dns_rdataset_t *rdataset,
                          const dns_name_t *owner_name,
                          dns_compress_t *cctx,
                          isc_buffer_t *target,
-                         dns_rdatasetorderfunc_t order,
-                         const void *order_arg,
                          unsigned int *countp)
 {
-       return (towiresorted(rdataset, owner_name, cctx, target,
-                            order, order_arg, 0, countp));
+       return (towiresorted(rdataset, owner_name, cctx, target, countp));
 }
 
 isc_result_t
@@ -483,6 +423,5 @@ dns_rdataset_towire(dns_rdataset_t *rdataset,
                    isc_buffer_t *target,
                    unsigned int *countp)
 {
-       return (towiresorted(rdataset, owner_name, cctx, target,
-                            NULL, NULL, 0, countp));
+       return (towiresorted(rdataset, owner_name, cctx, target, countp));
 }