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)
committerYves Orton <demerphq@gmail.com>
Wed, 13 Feb 2013 19:25:16 +0000 (20:25 +0100)
commitf14269908e5f8b4cab4b55643d7dd9de577e7918
tree04e741c57272b1d12d0216c58c4952c3f944be7b
parentca8de220718ba91d5a5fdd9779497cd5b0250258
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 f2a571dae7d70f7e3b59022834d8003ecd2df884)
(which was itself cherry picked (with changes) from commit f1220d61455253b170e81427c9d0357831ca0fac)
ext/Hash-Util-FieldHash/t/10_hash.t
hv.c
t/op/hash.t