Prevent premature hsplit() calls, and only trigger REHASH after hsplit()
authorYves Orton <demerphq@gmail.com>
Tue, 12 Feb 2013 09:53:05 +0000 (10:53 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sun, 3 Mar 2013 20:05:08 +0000 (20:05 +0000)
commitd59e31fc729d8a39a774f03bc6bc457029a7aef2
tree827a91a04cbe5ddaf0f0c3b0ea382aa32b6e1858
parentaa489f198c5a1d90ce4dde17566ccbb61c7eb942
Prevent premature hsplit() calls, and only trigger REHASH after hsplit()

Triggering a hsplit due to long chain length allows an attacker
to create a carefully chosen set of keys which can cause the hash
to use 2 * (2**32) * sizeof(void *) bytes ram. AKA a DOS via memory
exhaustion. Doing so also takes non trivial time.

Eliminating this check, and only inspecting chain length after a
normal hsplit() (triggered when keys>buckets) prevents the attack
entirely, and makes such attacks relatively benign.

(cherry picked from commit f1220d61455253b170e81427c9d0357831ca0fac)
ext/Hash-Util-FieldHash/t/10_hash.t
hv.c
t/op/hash.t