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:16:34 +0000 (10:16 -0500)
commit6e79fe5714a72b1ef86dc890ff60746cdd19f854
treeaf7158a0aa8af2b198a56acad48cac97221f8ad5
parent93635ed7d7d0752f3adeb8071409097f3360c85b
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.
ext/Hash-Util-FieldHash/t/10_hash.t
hv.c
t/op/hash.t