xt_hashlimit: fix race between htable_destroy and htable_gc
Subsystems (3)
PATCH 1/1 xt_hashlimit: fix race between htable_destroy and htable_gc
Deleting a timer with del_timer doesn't guarantee, that the timer function is not running at the moment of deletion. Thus in the xt_hashlimit case we can get into a ticklish situation when the htable_gc rearms the timer back and we'll actually delete an entry with a pending timer.
Fix it with using del_timer_sync().
AFAIK del_timer_sync checks for the timer to be pending by itself, so I remove the check.
---
net/netfilter/xt_hashlimit.c +1 -3
@@ -367,9 +367,7 @@ static void htable_gc(unsigned long htlong)static void htable_destroy (struct xt_hashlimit_htable *hinfo) { -/* remove timer, if it is pending */ -if (timer_pending (&hinfo->timer)) -del_timer (&hinfo->timer); +del_timer_sync (&hinfo->timer);/* remove proc entry */ remove_proc_entry(hinfo->pde->name,
Quoted 10 lines · Pavel Emelyanov
Deleting a timer with
del_timerdoesn't guarantee, that the timer function is not running at the moment of deletion. Thus in thext_hashlimitcase we can get into a ticklish situation when thehtable_gcrearms the timer back and we'll actually delete an entry with a pending timer.Fix it with using
del_timer_sync().AFAIK
del_timer_syncchecks for the timer to be pending by itself, so I remove the check.
Also applied, thanks.