]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netfilter: nf_flow_table: do not remove offload when other netns's interface is down
authorTaehee Yoo <ap420073@gmail.com>
Thu, 11 Oct 2018 18:46:29 +0000 (03:46 +0900)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 19 Oct 2018 11:30:48 +0000 (13:30 +0200)
When interface is down, offload cleanup function(nf_flow_table_do_cleanup)
is called and that checks whether interface index of offload and
index of link down interface is same. but only interface index checking
is not enough because flowtable is not pernet list.
So that, if other netns's interface that has index is same with offload
is down, that offload will be removed.
This patch adds netns checking code to the offload cleanup routine.

Fixes: 59c466dd68e7 ("netfilter: nf_flow_table: add a new flow state for tearing down offloading")
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_flow_table_core.c

index d8125616edc79dd311c12dd1806c97dd4e24f4e4..c188e27972c7ce7315f0c4841d97d68e675987a7 100644 (file)
@@ -478,14 +478,17 @@ EXPORT_SYMBOL_GPL(nf_flow_table_init);
 static void nf_flow_table_do_cleanup(struct flow_offload *flow, void *data)
 {
        struct net_device *dev = data;
+       struct flow_offload_entry *e;
+
+       e = container_of(flow, struct flow_offload_entry, flow);
 
        if (!dev) {
                flow_offload_teardown(flow);
                return;
        }
-
-       if (flow->tuplehash[0].tuple.iifidx == dev->ifindex ||
-           flow->tuplehash[1].tuple.iifidx == dev->ifindex)
+       if (net_eq(nf_ct_net(e->ct), dev_net(dev)) &&
+           (flow->tuplehash[0].tuple.iifidx == dev->ifindex ||
+            flow->tuplehash[1].tuple.iifidx == dev->ifindex))
                flow_offload_dead(flow);
 }