• Patrick McHardy's avatar
    netfilter: xt_hashlimit: fix race condition and simplify locking · 2eff25c1
    Patrick McHardy authored
    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: default avatarPatrick McHardy <kaber@trash.net>
    2eff25c1
xt_hashlimit.c 27.5 KB