Skip to content

Commit b03c521

Browse files
committed
netfilter: nf_dup_netdev: add and use recursion counter
jira LE-1907 Rebuild_History Non-Buildable kernel-5.14.0-284.30.1.el9_2 commit-author Florian Westphal <fw@strlen.de> commit fcd53c5 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 <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> (cherry picked from commit fcd53c5) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent 11627f0 commit b03c521

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)