From: Mark Andrews Date: Thu, 22 Dec 2011 23:43:52 +0000 (+0000) Subject: 3260. [bug] "rrset-order cyclic" could appears to not rotate X-Git-Tag: v9.9.0rc1~1^2~9 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=41ca314cc2fafaaa9089438bdfd24880bafa9079;p=thirdparty%2Fbind9.git 3260. [bug] "rrset-order cyclic" could appears to not rotate for some query patterns. [RT #27170] --- diff --git a/CHANGES b/CHANGES index ab6060de474..500853a5a2e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3260. [bug] "rrset-order cyclic" could appears to not rotate + for some query patterns. [RT #27170] + --- 9.9.0rc1 released --- 3259. [bug] named-compilezone: Suppress "dump zone to " diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index d4e7316dc34..c346118c553 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.323 2011/12/07 22:21:05 marka Exp $ */ +/* $Id: rbtdb.c,v 1.324 2011/12/22 23:43:52 marka Exp $ */ /*! \file */ @@ -2744,6 +2744,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, @@ -2783,6 +2791,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;