netfilter: restart search if moved to other chain
commit 95a8d19f28e6b29377a880c6264391a62e07fccc upstream. 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: ea781f197d6a ("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> Acked-by: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2adda392d2
commit
2cf26badef
@ -719,6 +719,7 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple,
|
||||
* least once for the stats anyway.
|
||||
*/
|
||||
rcu_read_lock_bh();
|
||||
begin:
|
||||
hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[hash], hnnode) {
|
||||
ct = nf_ct_tuplehash_to_ctrack(h);
|
||||
if (ct != ignored_conntrack &&
|
||||
@ -730,6 +731,12 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple,
|
||||
}
|
||||
NF_CT_STAT_INC(net, searched);
|
||||
}
|
||||
|
||||
if (get_nulls_value(n) != hash) {
|
||||
NF_CT_STAT_INC(net, search_restart);
|
||||
goto begin;
|
||||
}
|
||||
|
||||
rcu_read_unlock_bh();
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user