3.16.40-rc1 review patch.  If anyone has any objections, please let me know.

------------------

From: Florian Westphal <f...@strlen.de>

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 <eduma...@google.com>
Fixes: ea781f197d6a ("netfilter: nf_conntrack: use SLAB_DESTROY_BY_RCU and get 
rid of call_rcu()")
Signed-off-by: Florian Westphal <f...@strlen.de>
Acked-by: Eric Dumazet <eduma...@google.com>
Signed-off-by: Pablo Neira Ayuso <pa...@netfilter.org>
[bwh: Backported to 3.16:
 - Adjust context
 - Use NF_CT_STAT_INC(), not the _ATOMIC variant, since we disable BHs]
Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 net/netfilter/nf_conntrack_core.c | 7 +++++++
 1 file changed, 7 insertions(+)

--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -726,6 +726,7 @@ nf_conntrack_tuple_taken(const struct nf
         * 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 &&
@@ -737,6 +738,12 @@ nf_conntrack_tuple_taken(const struct nf
                }
                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;

Reply via email to