Skip to content

Commit 0240bce

Browse files
author
Paolo Abeni
committed
Merge tag 'nf-24-08-28' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf
Pablo Neira Ayuso says: ==================== Netfilter fixes for net The following patchset contains Netfilter fixes for net: Patch #1 sets on NFT_PKTINFO_L4PROTO for UDP packets less than 4 bytes payload from netdev/egress by subtracting skb_network_offset() when validating IPv4 packet length, otherwise 'meta l4proto udp' never matches. Patch #2 subtracts skb_network_offset() when validating IPv6 packet length for netdev/egress. netfilter pull request 24-08-28 * tag 'nf-24-08-28' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf: netfilter: nf_tables_ipv6: consider network offset in netdev/egress validation netfilter: nf_tables: restore IP sanity checks for netdev/egress ==================== Link: https://patch.msgid.link/20240828214708.619261-1-pablo@netfilter.org Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2 parents 6213dcc + 70c261d commit 0240bce

2 files changed

Lines changed: 9 additions & 6 deletions

File tree

include/net/netfilter/nf_tables_ipv4.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ static inline void nft_set_pktinfo_ipv4(struct nft_pktinfo *pkt)
1919
static inline int __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt)
2020
{
2121
struct iphdr *iph, _iph;
22-
u32 len, thoff;
22+
u32 len, thoff, skb_len;
2323

2424
iph = skb_header_pointer(pkt->skb, skb_network_offset(pkt->skb),
2525
sizeof(*iph), &_iph);
@@ -30,8 +30,10 @@ static inline int __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt)
3030
return -1;
3131

3232
len = iph_totlen(pkt->skb, iph);
33-
thoff = skb_network_offset(pkt->skb) + (iph->ihl * 4);
34-
if (pkt->skb->len < len)
33+
thoff = iph->ihl * 4;
34+
skb_len = pkt->skb->len - skb_network_offset(pkt->skb);
35+
36+
if (skb_len < len)
3537
return -1;
3638
else if (len < thoff)
3739
return -1;
@@ -40,7 +42,7 @@ static inline int __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt)
4042

4143
pkt->flags = NFT_PKTINFO_L4PROTO;
4244
pkt->tprot = iph->protocol;
43-
pkt->thoff = thoff;
45+
pkt->thoff = skb_network_offset(pkt->skb) + thoff;
4446
pkt->fragoff = ntohs(iph->frag_off) & IP_OFFSET;
4547

4648
return 0;

include/net/netfilter/nf_tables_ipv6.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ static inline int __nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt)
3131
struct ipv6hdr *ip6h, _ip6h;
3232
unsigned int thoff = 0;
3333
unsigned short frag_off;
34+
u32 pkt_len, skb_len;
3435
int protohdr;
35-
u32 pkt_len;
3636

3737
ip6h = skb_header_pointer(pkt->skb, skb_network_offset(pkt->skb),
3838
sizeof(*ip6h), &_ip6h);
@@ -43,7 +43,8 @@ static inline int __nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt)
4343
return -1;
4444

4545
pkt_len = ntohs(ip6h->payload_len);
46-
if (pkt_len + sizeof(*ip6h) > pkt->skb->len)
46+
skb_len = pkt->skb->len - skb_network_offset(pkt->skb);
47+
if (pkt_len + sizeof(*ip6h) > skb_len)
4748
return -1;
4849

4950
protohdr = ipv6_find_hdr(pkt->skb, &thoff, -1, &frag_off, &flags);

0 commit comments

Comments
 (0)