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)
committerRicardo Signes <rjbs@cpan.org>
Mon, 4 Mar 2013 15:15:39 +0000 (10:15 -0500)
commit9d83adcdf9ab3c1ac7d54d76f3944e57278f0e70
tree7d2db89db975f620ef3d00de69a4b6dcd6b37652
parent36a8248953423da007594af6ed330498ef5e3202
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