netfilter: xt_hashlimit: fix race condition and simplify locking
authorPatrick McHardy <kaber@trash.net>
Wed, 3 Feb 2010 12:24:54 +0000 (13:24 +0100)
committerPatrick McHardy <kaber@trash.net>
Wed, 3 Feb 2010 12:24:54 +0000 (13:24 +0100)
commit2eff25c18c3d332d3c4dd98f2ac9b7114e9771b0
treec5b42ff3fb067e6f632edd716b9a4b70c4378ee8
parent10a199394b8f9b4c4e0be6e14a61109a7d891b1b
netfilter: xt_hashlimit: fix race condition and simplify locking

As noticed by Shin Hong <hongshin@gmail.com>, there is a race between
htable_find_get() and htable_put():

htable_put(): htable_find_get():

spin_lock_bh(&hashlimit_lock);
<search entry>
atomic_dec_and_test(&hinfo->use)
atomic_inc(&hinfo->use)
spin_unlock_bh(&hashlimit_lock)
return hinfo;
spin_lock_bh(&hashlimit_lock);
hlist_del(&hinfo->node);
spin_unlock_bh(&hashlimit_lock);
htable_destroy(hinfo);

The entire locking concept is overly complicated, tables are only
created/referenced and released in process context, so a single
mutex works just fine. Remove the hashinfo_spinlock and atomic
reference count and use the mutex to protect table lookups/creation
and reference count changes.

Signed-off-by: Patrick McHardy <kaber@trash.net>
net/netfilter/xt_hashlimit.c