netfilter: restart search if moved to other chain
In case nf_conntrack_tuple_taken did not find a conflicting entry
check that all entries in this hash slot were tested and restart
in case an entry was moved to another chain.
Reported-by: Eric Dumazet <edumazet@google.com>
Fixes: ea781f197d
("netfilter: nf_conntrack: use SLAB_DESTROY_BY_RCU and get rid of call_rcu()")
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
7073b16f3d
commit
95a8d19f28
@ -809,6 +809,7 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple,
|
|||||||
zone = nf_ct_zone(ignored_conntrack);
|
zone = nf_ct_zone(ignored_conntrack);
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
begin:
|
||||||
nf_conntrack_get_ht(&ct_hash, &hsize);
|
nf_conntrack_get_ht(&ct_hash, &hsize);
|
||||||
hash = __hash_conntrack(net, tuple, hsize);
|
hash = __hash_conntrack(net, tuple, hsize);
|
||||||
|
|
||||||
@ -822,6 +823,12 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple,
|
|||||||
}
|
}
|
||||||
NF_CT_STAT_INC_ATOMIC(net, searched);
|
NF_CT_STAT_INC_ATOMIC(net, searched);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (get_nulls_value(n) != hash) {
|
||||||
|
NF_CT_STAT_INC_ATOMIC(net, search_restart);
|
||||||
|
goto begin;
|
||||||
|
}
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user