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>
Thu, 14 Feb 2013 07:09:47 +0000 (08:09 +0100)
commit2674b61957c26a4924831d5110afa454ae7ae5a6
tree0e50d8e9495551f739cb170be34d8a663d110f95
parentd327d01be059078a0f4dd9e2f675f7b4d867764a
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 f14269908e5f8b4cab4b55643d7dd9de577e7918)
(which was itself cherry picked from commit f2a571dae7d70f7e3b59022834d8003ecd2df884)
(which was itself cherry picked (with changes) from commit f1220d61455253b170e81427c9d0357831ca0fac)
hv.c
t/op/hash.t