]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix off-by-one error when calculating new hashtable size
authorOndřej Surý <ondrej@sury.org>
Fri, 28 Aug 2020 07:30:29 +0000 (09:30 +0200)
committerOndřej Surý <ondrej@isc.org>
Fri, 28 Aug 2020 18:43:38 +0000 (20:43 +0200)
When calculating the new hashtable bitsize, there was an off-by-one
error that would allow the new bitsize to be larger than maximum allowed
causing assertion failure in the rehash() function.

(cherry picked from commit 78543ad5a7731e5f3a309c73e90a552df1a44af1)

lib/dns/rbt.c

index ab5453e78c602030d08ef6e4d208455bf22b30b0..69b847c6d187d0f83a3a819e8e8bd4962a23529d 100644 (file)
@@ -2331,10 +2331,9 @@ inithash(dns_rbt_t *rbt) {
 
 static uint32_t
 rehash_bits(dns_rbt_t *rbt, size_t newcount) {
-       uint32_t oldbits = rbt->hashbits;
-       uint32_t newbits = oldbits;
+       uint32_t newbits = rbt->hashbits;
 
-       while (newcount >= HASHSIZE(newbits) && newbits <= rbt->maxhashbits) {
+       while (newcount >= HASHSIZE(newbits) && newbits < rbt->maxhashbits) {
                newbits += 1;
        }
 
@@ -2381,7 +2380,7 @@ rehash(dns_rbt_t *rbt, uint32_t newbits) {
 static void
 maybe_rehash(dns_rbt_t *rbt, size_t newcount) {
        uint32_t newbits = rehash_bits(rbt, newcount);
-       if (rbt->hashbits < newbits && newbits <= RBT_HASH_MAX_BITS) {
+       if (rbt->hashbits < newbits && newbits <= rbt->maxhashbits) {
                rehash(rbt, newbits);
        }
 }