]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3260. [bug] "rrset-order cyclic" could appear to not rotate
authorMark Andrews <marka@isc.org>
Thu, 22 Dec 2011 23:55:25 +0000 (23:55 +0000)
committerMark Andrews <marka@isc.org>
Thu, 22 Dec 2011 23:55:25 +0000 (23:55 +0000)
                        for some query patterns.  [RT #27170]

CHANGES
lib/dns/rbtdb.c

diff --git a/CHANGES b/CHANGES
index e14f8ccc89bbf7be91416a81091614bb668f0b13..fcde11fd038d7bff68da2c495ae2dbeb427054aa 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3260.  [bug]           "rrset-order cyclic" could appear to not rotate
+                       for some query patterns.  [RT #27170]
+
 3259.  [bug]           named-compilezone: Suppress "dump zone to <file>"
                        message when writing to stdout. [RT #27109]
 
index 45bb394824cad9d4d0934e3657158315905e39c7..3f81de1498ef49b1cd8f60b3f0bc4b77983d8b97 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rbtdb.c,v 1.270.12.38 2011/12/07 22:27:21 marka Exp $ */
+/* $Id: rbtdb.c,v 1.270.12.39 2011/12/22 23:55:25 marka Exp $ */
 
 /*! \file */
 
@@ -2697,6 +2697,14 @@ zone_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) {
        return (result);
 }
 
+static inline unsigned int
+prand(isc_uint32_t val) {
+       val ^= val >> 16;
+       val ^= val >> 8;
+       val ^= val >> 4;
+       return (val & 0xf);
+}
+
 static inline void
 bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
              rdatasetheader_t *header, isc_stdtime_t now,
@@ -2736,6 +2744,8 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
        raw = (unsigned char *)header + sizeof(*header);
        rdataset->private3 = raw;
        rdataset->count = header->count++;
+       /* Add a weak pseudo random value [0..15]. */
+       header->count += prand(header->count);
        if (rdataset->count == ISC_UINT32_MAX)
                rdataset->count = 0;