Skip to content

Commit fcd53c5

Browse files
Florian Westphalummakynes
authored andcommitted
netfilter: nf_dup_netdev: add and use recursion counter
Now that the egress function can be called from egress hook, we need to avoid recursive calls into the nf_tables traverser, else crash. Fixes: f87b946 ("netfilter: nft_fwd_netdev: Support egress hook") Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 574a5b8 commit fcd53c5

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

net/netfilter/nf_dup_netdev.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,31 @@
1313
#include <net/netfilter/nf_tables_offload.h>
1414
#include <net/netfilter/nf_dup_netdev.h>
1515

16+
#define NF_RECURSION_LIMIT 2
17+
18+
static DEFINE_PER_CPU(u8, nf_dup_skb_recursion);
19+
1620
static void nf_do_netdev_egress(struct sk_buff *skb, struct net_device *dev,
1721
enum nf_dev_hooks hook)
1822
{
23+
if (__this_cpu_read(nf_dup_skb_recursion) > NF_RECURSION_LIMIT)
24+
goto err;
25+
1926
if (hook == NF_NETDEV_INGRESS && skb_mac_header_was_set(skb)) {
20-
if (skb_cow_head(skb, skb->mac_len)) {
21-
kfree_skb(skb);
22-
return;
23-
}
27+
if (skb_cow_head(skb, skb->mac_len))
28+
goto err;
29+
2430
skb_push(skb, skb->mac_len);
2531
}
2632

2733
skb->dev = dev;
2834
skb_clear_tstamp(skb);
35+
__this_cpu_inc(nf_dup_skb_recursion);
2936
dev_queue_xmit(skb);
37+
__this_cpu_dec(nf_dup_skb_recursion);
38+
return;
39+
err:
40+
kfree_skb(skb);
3041
}
3142

3243
void nf_fwd_netdev_egress(const struct nft_pktinfo *pkt, int oif)

0 commit comments

Comments
 (0)