diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2008-07-31 00:38:52 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-31 00:38:52 -0700 |
commit | 967ab999a090b1a4e7d3c7febfd6d89b42fb4cf4 (patch) | |
tree | 7ccc98a3ef1be4ca3129de23b083ab2bc47eb5c3 | |
parent | a8ddc9163c6a16cd62531dba1ec5020484e33b02 (diff) | |
download | linux-3.10-967ab999a090b1a4e7d3c7febfd6d89b42fb4cf4.tar.gz linux-3.10-967ab999a090b1a4e7d3c7febfd6d89b42fb4cf4.tar.bz2 linux-3.10-967ab999a090b1a4e7d3c7febfd6d89b42fb4cf4.zip |
netfilter: 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.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/netfilter/xt_hashlimit.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index 6809af542a2..d9418a26781 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c @@ -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, |