summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal2014-03-07 14:37:10 +0100
committerPablo Neira Ayuso2014-03-12 13:55:01 +0100
commitd9ec4f1ee280e5f8732e3c40ca672419b2532600 (patch)
treea751b086f8c4e6acdb8d2e220ba76d351930ad79
parentnetfilter: connlimit: factor hlist search into new function (diff)
downloadkernel-qcow2-linux-d9ec4f1ee280e5f8732e3c40ca672419b2532600.tar.gz
kernel-qcow2-linux-d9ec4f1ee280e5f8732e3c40ca672419b2532600.tar.xz
kernel-qcow2-linux-d9ec4f1ee280e5f8732e3c40ca672419b2532600.zip
netfilter: connlimit: improve packet-to-closed-connection logic
Instead of freeing the entry from our list and then adding it back again in the 'packet to closing connection' case just keep the matching entry around. Also drop the found_ct != NULL test as nf_ct_tuplehash_to_ctrack is just container_of(). Reviewed-by: Jesper Dangaard Brouer <brouer@redhat.com> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--net/netfilter/xt_connlimit.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
index 6988818acf88..d4c6db1af8ef 100644
--- a/net/netfilter/xt_connlimit.c
+++ b/net/netfilter/xt_connlimit.c
@@ -112,29 +112,22 @@ static int count_hlist(struct net *net,
hlist_for_each_entry_safe(conn, n, head, node) {
found = nf_conntrack_find_get(net, NF_CT_DEFAULT_ZONE,
&conn->tuple);
- found_ct = NULL;
+ if (found == NULL) {
+ hlist_del(&conn->node);
+ kfree(conn);
+ continue;
+ }
- if (found != NULL)
- found_ct = nf_ct_tuplehash_to_ctrack(found);
+ found_ct = nf_ct_tuplehash_to_ctrack(found);
- if (found_ct != NULL &&
- nf_ct_tuple_equal(&conn->tuple, tuple) &&
- !already_closed(found_ct))
+ if (nf_ct_tuple_equal(&conn->tuple, tuple)) {
/*
* Just to be sure we have it only once in the list.
* We should not see tuples twice unless someone hooks
* this into a table without "-p tcp --syn".
*/
addit = false;
-
- if (found == NULL) {
- /* this one is gone */
- hlist_del(&conn->node);
- kfree(conn);
- continue;
- }
-
- if (already_closed(found_ct)) {
+ } else if (already_closed(found_ct)) {
/*
* we do not care about connections which are
* closed already -> ditch it